import { Router, type Response } from "express";
import { requireBoardAccess } from "../lib/authz";
import { prisma } from "../lib/prisma";
import { emitToBoard } from "../lib/socketBus";
import { HttpError } from "../middleware/errorHandler";
import { requireAuth } from "../middleware/requireAuth";

export const attachmentsRouter = Router();
attachmentsRouter.use(requireAuth);

const cardDetailInclude = {
  labels: { include: { label: true } },
  members: { include: { user: true } },
  checklists: { include: { items: { include: { assignees: { include: { user: true } } } } } },
  comments: { include: { author: true, reactions: true, mentions: true, seenBy: true }, orderBy: { createdAt: "asc" as const } },
  attachments: { include: { uploader: true } },
  customFieldValues: { include: { customField: true } },
  status: true,
};

async function respondWithCard(cardId: string, boardId: string, res: Response) {
  const updated = await prisma.card.findUnique({ where: { id: cardId }, include: cardDetailInclude });
  emitToBoard(boardId, "card:updated", { card: updated });
  res.json({ card: updated });
}

attachmentsRouter.delete("/:id", async (req, res, next) => {
  try {
    const attachment = await prisma.attachment.findUnique({
      where: { id: req.params.id },
      include: { card: true },
    });
    if (!attachment) throw new HttpError(404, "Attachment not found");
    await requireBoardAccess(req.userId!, attachment.card.boardId, "MEMBER");

    await prisma.attachment.delete({ where: { id: req.params.id } });
    await respondWithCard(attachment.cardId, attachment.card.boardId, res);
  } catch (err) {
    next(err);
  }
});
