import { getSessionUser } from "@/lib/auth";
import {
  deleteMailboxSenderMoveRulesByEmail,
  getMailboxMoveRuleSettingsByEmail,
  saveMailboxSenderMoveRuleByEmail,
} from "@/lib/official-mail";

type SaveMoveRulePayload = {
  moveExistingMessages?: boolean;
  ruleId?: number | string | null;
  senderAddress?: string;
  targetFolder?: string;
};

type DeleteMoveRulesPayload = {
  ruleIds?: Array<number | string>;
};

function moveRuleError(error: unknown) {
  const code = error instanceof Error ? error.message : "move-rule-failed";
  const message =
    code === "move-rule-invalid-sender"
      ? "올바른 보낸사람 메일 주소를 입력해주세요."
      : code === "move-rule-sender-exists"
        ? "해당 보낸사람의 자동분류 규칙이 이미 있습니다."
        : code === "mailbox-state-changed"
          ? "다른 메일 이동이 진행 중입니다. 잠시 후 다시 시도해주세요."
        : code === "continue-move-custom-folder-only" ||
            code === "folder-not-found"
          ? "이동할 내 메일함을 다시 선택해주세요."
          : code === "continue-move-rule-limit"
            ? "자동분류 규칙은 최대 1,000개까지 등록할 수 있습니다."
            : code === "move-rule-not-found"
              ? "자동분류 규칙을 찾지 못했습니다. 새로고침 후 다시 시도해주세요."
              : "자동분류 설정을 처리하지 못했습니다. 잠시 후 다시 시도해주세요.";

  return Response.json(
    { error: code, message, ok: false },
    {
      status:
        code === "move-rule-not-found"
          ? 404
          : code === "mailbox-state-changed"
            ? 409
          : code === "move-rule-failed"
            ? 500
            : 400,
    },
  );
}

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

  try {
    const settings = await getMailboxMoveRuleSettingsByEmail(user.email);
    const senderAddress = new URL(request.url).searchParams
      .get("sender")
      ?.trim()
      .toLowerCase();

    return Response.json({
      ok: true,
      rule: senderAddress
        ? (settings.rules.find(
            (rule) => rule.senderAddress === senderAddress,
          ) ?? null)
        : undefined,
      settings,
    });
  } catch (error) {
    return moveRuleError(error);
  }
}

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 SaveMoveRulePayload | null;
  const senderAddress = String(payload?.senderAddress ?? "").trim();
  const targetFolder = String(payload?.targetFolder ?? "").trim();
  const ruleIdValue = Number(payload?.ruleId ?? 0);

  try {
    const rule = await saveMailboxSenderMoveRuleByEmail(user.email, {
      moveExistingMessages: Boolean(payload?.moveExistingMessages),
      ruleId:
        Number.isInteger(ruleIdValue) && ruleIdValue > 0 ? ruleIdValue : null,
      senderAddress,
      targetFolder,
    });
    return Response.json(
      { jobId: rule.moveResult?.jobId ?? null, ok: true, queued: rule.moveResult?.queued ?? false, result: rule.moveResult, rule },
      { status: rule.moveResult?.queued ? 202 : 200 }
    );
  } catch (error) {
    return moveRuleError(error);
  }
}

export async function DELETE(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 DeleteMoveRulesPayload | null;

  try {
    const deletedCount = await deleteMailboxSenderMoveRulesByEmail(
      user.email,
      payload?.ruleIds ?? [],
    );
    return Response.json({ deletedCount, ok: true });
  } catch (error) {
    return moveRuleError(error);
  }
}
