import { getSessionUser } from "@/lib/auth";
import {
  backupMailboxFolderByEmail,
  clearMailboxFolderByEmail,
  createMailboxFolderByEmail,
  deleteMailboxFolderByEmail,
  markMailboxFolderReadByEmail,
  renameMailboxFolderByEmail,
} from "@/lib/official-mail";

type FolderActionPayload = {
  action?: "backup" | "clear" | "create" | "delete" | "mark-read" | "rename";
  folder?: string;
  insertAfterFolder?: string;
  insertAtTop?: boolean;
  label?: string;
  name?: string;
};

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

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

  const payload = (await request.json().catch(() => null)) as FolderActionPayload | null;
  const action = String(payload?.action ?? "").trim();
  const folder = String(payload?.folder ?? "").trim();
  const nextName = String(payload?.name ?? "").trim();
  const insertAfterFolder = String(payload?.insertAfterFolder ?? "").trim();
  const insertAtTop = Boolean(payload?.insertAtTop);
  const label = String(payload?.label ?? "").trim() || "메일함";

  if (action !== "create" && !folder) {
    return Response.json(
      {
        error: "folder-required",
        notice: { message: "대상 메일함을 찾을 수 없습니다.", tone: "error" },
        ok: false,
      },
      { status: 400 },
    );
  }

  try {
    if (action === "create") {
      const createdFolder = await createMailboxFolderByEmail(user.email, nextName, {
        insertAfterSystemName: insertAfterFolder || null,
        insertAtTop,
      });

      return Response.json({
        notice: {
          message: `${createdFolder.name} 메일함을 만들었습니다.`,
          tone: "success",
        },
        ok: true,
        result: createdFolder,
      });
    }

    if (action === "mark-read") {
      const updatedCount = await markMailboxFolderReadByEmail(user.email, folder);

      return Response.json({
        notice: {
          message:
            updatedCount > 0
              ? `${label}의 메일을 모두 읽음 처리했습니다.`
              : `${label}에는 읽지 않은 메일이 없습니다.`,
          tone: "success",
        },
        ok: true,
        result: { updatedCount },
      });
    }

    if (action === "clear") {
      const deletedCount = await clearMailboxFolderByEmail(user.email, folder);

      return Response.json({
        notice: {
          message:
            deletedCount > 0
              ? `${label} 비우기를 완료했습니다.`
              : `${label}에는 비울 메일이 없습니다.`,
          tone: "success",
        },
        ok: true,
        result: { deletedCount },
      });
    }

    if (action === "backup") {
      const result = await backupMailboxFolderByEmail(user.email, folder);

      return Response.json({
        notice: {
          message:
            result.copiedCount > 0
              ? `${label} 메일을 ${result.folderName} 메일함으로 백업했습니다.`
              : `${label}에는 백업할 메일이 없습니다.`,
          tone: "success",
        },
        ok: true,
        result,
      });
    }

    if (action === "rename") {
      const renamedFolder = await renameMailboxFolderByEmail(user.email, folder, nextName);

      return Response.json({
        notice: {
          message: `${renamedFolder.name}(으)로 이름을 변경했습니다.`,
          tone: "success",
        },
        ok: true,
        result: renamedFolder,
      });
    }

    if (action === "delete") {
      const result = await deleteMailboxFolderByEmail(user.email, folder);

      return Response.json({
        notice: {
          message:
            result.movedCount > 0
              ? `${result.deletedFolderName} 메일함을 삭제하고 메일 ${result.movedCount}건을 받은메일함으로 옮겼습니다.`
              : `${result.deletedFolderName} 메일함을 삭제했습니다.`,
          tone: "success",
        },
        ok: true,
        result,
      });
    }

    return Response.json(
      {
        error: "invalid-action",
        notice: { message: "지원하지 않는 폴더 작업입니다.", tone: "error" },
        ok: false,
      },
      { status: 400 },
    );
  } catch (error) {
    const detail = error instanceof Error ? error.message : "folder-action-failed";
    const errorMessage =
      detail === "custom-folder-only"
        ? "사용자 메일함에서만 가능한 작업입니다."
        : detail === "folder-name-exists"
          ? "같은 이름의 메일함이 이미 있습니다."
          : detail === "mailbox-move-failed" || detail.includes("Duplicate entry")
            ? "메일함 상태가 최신이 아니어서 작업을 완료하지 못했습니다. 메일함을 다시 동기화한 뒤 다시 시도해주세요."
          : detail === "folder-name-required"
            ? "메일함 이름을 입력해주세요."
            : detail === "folder-not-found"
              ? "대상 메일함을 찾을 수 없습니다."
              : detail === "mailbox-move-failed"
                ? "메일을 받은메일함으로 옮기지 못해 삭제를 완료하지 못했습니다."
                :
      detail === "folder-clear-not-allowed"
        ? "이 메일함은 비우기를 지원하지 않습니다."
        : "폴더 작업 중 오류가 발생했습니다.";
    const status =
      detail === "folder-clear-not-allowed" ||
      detail === "custom-folder-only" ||
      detail === "folder-name-exists" ||
      detail === "folder-name-required" ||
      detail === "folder-not-found" ||
      detail === "mailbox-move-failed" ||
      detail.includes("Duplicate entry")
        ? 400
        : 500;

    return Response.json(
      {
        error: detail,
        notice: { message: errorMessage, tone: "error" },
        ok: false,
      },
      { status },
    );
  }
}
