import { getSessionUser } from "@/lib/auth";
import {
  createTemporaryComposeUploadsForUserEmail,
  type ComposeUploadKind,
} from "@/lib/mail-compose-uploads";

export const runtime = "nodejs";

function pickUploadKind(value: FormDataEntryValue | null): ComposeUploadKind {
  return value === "inline-image" ? "inline-image" : "attachment";
}

function mapUploadError(error: unknown) {
  if (!(error instanceof Error)) {
    return { message: "업로드 중 오류가 발생했습니다.", status: 500 };
  }

  if (error.message === "upload-empty") {
    return { message: "비어 있는 파일은 업로드할 수 없습니다.", status: 400 };
  }

  if (error.message === "upload-too-large") {
    return { message: "업로드 가능한 최대 파일 크기를 초과했습니다.", status: 400 };
  }

  if (error.message === "upload-image-only") {
    return { message: "본문 이미지는 이미지 파일만 업로드할 수 있습니다.", status: 400 };
  }

  return { message: "업로드 중 오류가 발생했습니다.", status: 500 };
}

export async function POST(request: Request) {
  const user = await getSessionUser();

  if (!user) {
    return Response.json({ error: "unauthorized" }, { status: 401 });
  }

  const formData = await request.formData();
  const kind = pickUploadKind(formData.get("kind"));
  const fileEntries = formData
    .getAll("files")
    .filter((entry): entry is File => entry instanceof File);

  if (fileEntries.length === 0) {
    return Response.json({ error: "no-files" }, { status: 400 });
  }

  try {
    const uploads = await createTemporaryComposeUploadsForUserEmail({
      email: user.email,
      files: await Promise.all(
        fileEntries.map(async (file) => ({
          buffer: Buffer.from(await file.arrayBuffer()),
          contentType: file.type || "application/octet-stream",
          filename: file.name || "upload",
          sizeBytes: file.size,
        })),
      ),
      kind,
    });

    return Response.json({
      ok: true,
      uploads,
    });
  } catch (error) {
    const mapped = mapUploadError(error);
    return Response.json({ error: mapped.message }, { status: mapped.status });
  }
}
