import { getSessionUser } from "@/lib/auth";
import {
  isKavenixAdminEmail,
  updateKavenixDomainPrimaryEmailById,
} from "@/lib/kavenix-admin";

type PrimaryEmailRequestBody = {
  localPart?: unknown;
};

function isSameOriginRequest(request: Request) {
  const origin = request.headers.get("origin");
  const forwardedHost = request.headers.get("x-forwarded-host")?.split(",")[0]?.trim();
  const host = forwardedHost || request.headers.get("host");

  if (!origin || !host) {
    return false;
  }

  try {
    return new URL(origin).host.toLowerCase() === host.toLowerCase();
  } catch {
    return false;
  }
}

function primaryEmailErrorMessage(code: string) {
  switch (code) {
    case "kavenix-domain-not-found":
    case "kavenix-primary-email-mailbox-not-found":
      return "변경할 대표 메일함을 찾을 수 없습니다.";
    case "kavenix-domain-cleaned":
      return "정리된 도메인의 대표 메일은 변경할 수 없습니다.";
    case "kavenix-operational-domain-hidden":
      return "내부 운영 도메인의 대표 메일은 이 화면에서 변경할 수 없습니다.";
    case "kavenix-primary-email-local-part-invalid":
      return "메일 주소 앞부분은 영문 소문자, 숫자, 점(.), 밑줄(_), 하이픈(-)으로 1~64자 이내로 입력해주세요.";
    case "kavenix-primary-email-unchanged":
      return "현재 대표 메일과 동일한 주소입니다.";
    case "kavenix-primary-email-exists":
    case "mailcow-mailbox-target-exists":
      return "이미 사용 중인 메일 주소입니다.";
    case "mailcow-mailbox-source-missing":
      return "Mailcow에서 현재 대표 메일함을 찾을 수 없습니다. 먼저 메일 연결 복구를 실행해주세요.";
    case "kavenix-primary-email-change-busy":
      return "이 도메인의 대표 메일을 변경하고 있습니다. 잠시 후 다시 시도해주세요.";
    case "kavenix-primary-email-state-mismatch":
    case "kavenix-primary-email-state-changed":
      return "대표 계정과 메일함 상태가 일치하지 않습니다. 새로고침 후 다시 시도해주세요.";
    case "mailcow-mailbox-rename-not-applied":
      return "Mailcow에서 대표 메일 변경이 반영되지 않았습니다.";
    case "mailcow-mailbox-rename-state-unknown":
      return "Mailcow 변경 결과를 확정하지 못했습니다. 잠시 후 같은 주소로 다시 시도하면 안전하게 이어서 처리됩니다.";
    default:
      return "대표 메일을 변경하지 못했습니다. 잠시 후 다시 시도해주세요.";
  }
}

export async function POST(
  request: Request,
  context: { params: Promise<{ domainId: string }> },
) {
  if (!isSameOriginRequest(request)) {
    return Response.json(
      { error: "forbidden-origin", message: "허용되지 않은 요청입니다." },
      { status: 403 },
    );
  }

  const user = await getSessionUser();

  if (!user) {
    return Response.json(
      { error: "unauthorized", message: "로그인이 필요합니다." },
      { status: 401 },
    );
  }

  if (!isKavenixAdminEmail(user.email)) {
    return Response.json(
      { error: "forbidden", message: "최고관리자만 대표 메일을 변경할 수 있습니다." },
      { status: 403 },
    );
  }

  const { domainId } = await context.params;
  const body = (await request.json().catch(() => ({}))) as PrimaryEmailRequestBody;

  if (typeof body.localPart !== "string") {
    return Response.json(
      { error: "invalid-request", message: "변경할 대표 메일 주소를 입력해주세요." },
      { status: 400 },
    );
  }

  try {
    const result = await updateKavenixDomainPrimaryEmailById({
      domainId: Number(domainId),
      localPart: body.localPart,
      requestedByEmail: user.email,
    });

    return Response.json({
      message: `${result.oldEmail}을 ${result.newEmail}로 변경했습니다. 이전 주소는 폐기되어 더 이상 수신되지 않습니다.`,
      ok: true,
      result,
    });
  } catch (error) {
    const code = error instanceof Error ? error.message : "";
    const normalizedCode = code.split(":", 1)[0] ?? code;

    return Response.json(
      {
        error: normalizedCode || "primary-email-update-failed",
        message: primaryEmailErrorMessage(normalizedCode),
      },
      {
        status:
          normalizedCode === "kavenix-domain-not-found" ||
          normalizedCode === "kavenix-primary-email-mailbox-not-found"
            ? 404
            : normalizedCode === "kavenix-primary-email-change-busy"
              ? 409
              : 400,
      },
    );
  }
}
