import { getSessionUser } from "@/lib/auth";
import { moveMailboxMessagesByEmail } from "@/lib/official-mail";

type MoveMailboxPayload = {
  messageIds?: Array<number | string>;
  targetFolder?: string;
};

function parseMessageIds(payload: MoveMailboxPayload) {
  return (payload.messageIds ?? [])
    .map((value) => Number(value))
    .filter((value) => Number.isInteger(value) && value > 0);
}

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 MoveMailboxPayload | null;
  const messageIds = parseMessageIds(payload ?? {});
  const targetFolder = String(payload?.targetFolder ?? "").trim();

  if (messageIds.length === 0) {
    return Response.json(
      {
        error: "message-required",
        notice: { message: "이동할 메일을 먼저 선택해 주세요.", tone: "error" },
        ok: false,
      },
      { status: 400 },
    );
  }

  if (!targetFolder) {
    return Response.json(
      {
        error: "target-folder-required",
        notice: { message: "이동할 메일함을 선택해 주세요.", tone: "error" },
        ok: false,
      },
      { status: 400 },
    );
  }

  try {
    const result = await moveMailboxMessagesByEmail(user.email, messageIds, targetFolder);
    const noticeMessage =
      targetFolder === "spam"
        ? "선택한 발신자의 모든 메일을 스팸으로 이동했습니다."
        : targetFolder === "trash"
          ? result.deletedCount > 0 && result.movedCount > 0
            ? "선택한 메일을 휴지통으로 이동하고, 휴지통에 있던 메일은 영구 삭제했습니다."
            : result.deletedCount > 0
              ? "선택한 메일을 영구 삭제했습니다."
              : "선택한 메일을 휴지통으로 이동했습니다."
          : "선택한 메일을 폴더로 이동했습니다.";

    return Response.json({
      notice: {
        message: noticeMessage,
        tone: "success",
      },
      ok: true,
      result,
    });
  } catch (error) {
    const detailMessage = error instanceof Error ? error.message : "move-failed";
    const errorCode =
      detailMessage === "sent-folder-only-outbound"
        ? "move-sent-only"
        : detailMessage === "folder-name-exists"
          ? "folder-name-exists"
          : detailMessage === "mailbox-move-failed" ||
              detailMessage === "mailbox-delete-failed" ||
              detailMessage.includes("Duplicate entry")
            ? "move-conflict"
            : "move-failed";
    const errorMessage =
      errorCode === "move-sent-only"
        ? "보낸 메일만 보낸메일함으로 이동할 수 있습니다."
        : errorCode === "folder-name-exists"
          ? "같은 이름의 메일함이 이미 있습니다."
          : errorCode === "move-conflict"
            ? "메일 상태가 최신이 아니어서 이동에 실패했습니다. 메일함을 다시 연 뒤 다시 시도해 주세요."
            : "메일 이동 중 오류가 발생했습니다.";

    return Response.json(
      {
        error: errorCode,
        notice: {
          message: errorMessage,
          tone: "error",
        },
        ok: false,
      },
      {
        status:
          errorCode === "move-sent-only" || errorCode === "folder-name-exists"
            ? 400
            : errorCode === "move-conflict"
              ? 409
              : 500,
      },
    );
  }
}
