import { getSessionUser } from "@/lib/auth";
import { buildContactExport, parseContactFile, type ContactExportField } from "@/lib/mail-contact-files";
import {
  bulkUpdateMailboxContactsByEmail,
  createMailboxContactGroupByEmail,
  getMailboxContactDuplicateGroupsByEmail,
  getMailboxContactImportCandidatesByEmail,
  getMailboxContactSettingsByEmail,
  mergeMailboxContactsByEmail,
  type MailboxContactInput
} from "@/lib/official-mail";

function toolsError(error: unknown) {
  const code = error instanceof Error ? error.message : "contact-tools-failed";
  const messages: Record<string, string> = {
    "contact-file-invalid": "주소록 파일 형식을 확인해주세요.",
    "contact-file-too-large": "주소록 파일은 5MB 이하만 불러올 수 있습니다.",
    "contact-group-limit": "주소록 그룹은 최대 200개까지 만들 수 있습니다.",
    "contact-group-name-required": "그룹 이름을 입력해주세요.",
    "contact-limit": "주소록은 최대 5,000개까지 저장할 수 있습니다.",
    "contact-merge-selection-required": "병합할 연락처를 2개 이상 선택해주세요.",
    "contact-selection-required": "처리할 연락처를 선택해주세요."
  };
  return Response.json(
    { error: code, message: messages[code] ?? "주소록을 처리하지 못했습니다. 잠시 후 다시 시도해주세요.", ok: false },
    { status: 400 }
  );
}

export async function GET(request: Request) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  const searchParams = new URL(request.url).searchParams;
  try {
    if (searchParams.get("action") === "mail-candidates") {
      const candidates = await getMailboxContactImportCandidatesByEmail(user.email, {
        minCount: Number(searchParams.get("minCount") ?? 2),
        months: Number(searchParams.get("months") ?? 6)
      });
      return Response.json({ candidates, ok: true });
    }
    if (searchParams.get("action") === "duplicates") {
      return Response.json({ groups: await getMailboxContactDuplicateGroupsByEmail(user.email), ok: true });
    }
    return Response.json({ error: "contact-tools-action-invalid", ok: false }, { status: 400 });
  } catch (error) {
    return toolsError(error);
  }
}

export async function POST(request: Request) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized", ok: false }, { status: 401 });

  try {
    if (request.headers.get("content-type")?.includes("multipart/form-data")) {
      const formData = await request.formData();
      const file = formData.get("file");
      if (!(file instanceof File)) throw new Error("contact-file-invalid");
      const rows = parseContactFile(file.name, Buffer.from(await file.arrayBuffer()));
      return Response.json({ ok: true, rows });
    }

    const payload = (await request.json().catch(() => null)) as Record<string, unknown> | null;
    const action = String(payload?.action ?? "");
    if (action === "group-create") {
      const groupName = await createMailboxContactGroupByEmail(user.email, String(payload?.groupName ?? ""));
      return Response.json({ groupName, ok: true });
    }
    if (action === "bulk") {
      const operation = String(payload?.operation ?? "") as "delete" | "group" | "vip";
      if (!["delete", "group", "vip"].includes(operation)) throw new Error("contact-tools-action-invalid");
      const result = await bulkUpdateMailboxContactsByEmail(user.email, {
        action: operation,
        contacts: Array.isArray(payload?.contacts) ? payload.contacts as MailboxContactInput[] : [],
        groupName: String(payload?.groupName ?? ""),
        isVip: Boolean(payload?.isVip)
      });
      return Response.json({ ok: true, ...result });
    }
    if (action === "import") {
      const result = await bulkUpdateMailboxContactsByEmail(user.email, {
        action: "import",
        contacts: Array.isArray(payload?.contacts) ? payload.contacts as MailboxContactInput[] : [],
        duplicateMode: payload?.duplicateMode === "skip" ? "skip" : "update",
        groupName: String(payload?.groupName ?? "")
      });
      return Response.json({ ok: true, ...result });
    }
    if (action === "merge") {
      const result = await mergeMailboxContactsByEmail(
        user.email,
        Array.isArray(payload?.contactIds) ? payload.contactIds as Array<number | string> : []
      );
      return Response.json({ ok: true, ...result });
    }
    if (action === "export") {
      const settings = await getMailboxContactSettingsByEmail(user.email);
      const selectedEmails = new Set(
        (Array.isArray(payload?.emails) ? payload.emails : []).map((value) => String(value).trim().toLowerCase())
      );
      const contacts = settings.contacts.filter((contact) => selectedEmails.size === 0 || selectedEmails.has(contact.email));
      const format = ["csv", "vcard", "xlsx"].includes(String(payload?.format))
        ? String(payload?.format) as "csv" | "vcard" | "xlsx"
        : "csv";
      const fields = Array.isArray(payload?.fields) ? payload.fields.map(String) as ContactExportField[] : undefined;
      const result = await buildContactExport(contacts, format, fields);
      return new Response(new Uint8Array(result.body), {
        headers: {
          "Content-Disposition": `attachment; filename="${result.fileName}"`,
          "Content-Type": result.contentType,
          "Cache-Control": "private, no-store"
        }
      });
    }
    return Response.json({ error: "contact-tools-action-invalid", ok: false }, { status: 400 });
  } catch (error) {
    return toolsError(error);
  }
}
