import { getSessionUser } from "@/lib/auth";
import {
  deleteMailboxDrawerItemByEmail,
  getMailboxDrawerUploadPayloadByEmail,
} from "@/lib/mailbox-file-drawer";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

function contentDisposition(filename: string, inline: boolean) {
  const safeAscii = filename.replace(/[^\x20-\x7e]+/g, "_").replace(/["\\]/g, "_") || "file";
  return `${inline ? "inline" : "attachment"}; filename="${safeAscii}"; filename*=UTF-8''${encodeURIComponent(filename)}`;
}

export async function GET(
  request: Request,
  context: { params: Promise<{ itemId: string }> },
) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized" }, { status: 401 });

  const { itemId } = await context.params;
  if (!itemId.startsWith("upload_")) {
    return Response.json({ error: "not-found" }, { status: 404 });
  }
  const payload = await getMailboxDrawerUploadPayloadByEmail(
    user.email,
    itemId.slice("upload_".length),
  );
  if (!payload) return Response.json({ error: "not-found" }, { status: 404 });

  const requestedInline = new URL(request.url).searchParams.get("mode") === "inline";
  const canInline = payload.mimeType.toLowerCase().startsWith("image/") || payload.mimeType === "application/pdf";
  return new Response(new Uint8Array(payload.body), {
    headers: {
      "Cache-Control": "private, max-age=60",
      "Content-Disposition": contentDisposition(payload.filename, requestedInline && canInline),
      "Content-Length": String(payload.body.length),
      "Content-Type": payload.mimeType,
      "X-Content-Type-Options": "nosniff",
    },
  });
}

export async function DELETE(
  _request: Request,
  context: { params: Promise<{ itemId: string }> },
) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized" }, { status: 401 });

  const { itemId } = await context.params;

  try {
    const deleted = await deleteMailboxDrawerItemByEmail(user.email, itemId);
    if (!deleted) return Response.json({ error: "not-found" }, { status: 404 });
    return Response.json({ cleanupQueued: true, ok: true }, { status: 202 });
  } catch {
    return Response.json(
      { error: "delete-failed", message: "파일 삭제 요청을 저장하지 못했습니다." },
      { status: 500 },
    );
  }
}
