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

type SendingServerRequestBody = {
  serverKey?: 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;
  }
}

export async function POST(
  request: Request,
  context: RouteContext<"/api/kavenix/domains/[domainId]/sending-server">,
) {
  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 SendingServerRequestBody;

  try {
    const result = await updateKavenixDomainSendingServerById(
      Number(domainId),
      body.serverKey,
    );

    return Response.json({
      message: `${result.domain}의 발송 서버를 ${result.sendingServer.label}(${result.sendingServer.host}:${result.sendingServer.port})로 변경했습니다.`,
      ok: true,
      result,
    });
  } catch (error) {
    const code = error instanceof Error ? error.message : "";
    const message =
      code === "kavenix-domain-not-found"
        ? "발송 서버를 변경할 도메인을 찾을 수 없습니다."
        : code === "kavenix-domain-cleaned"
          ? "정리된 도메인의 발송 서버는 변경할 수 없습니다."
          : code === "kavenix-operational-domain-hidden"
            ? "내부 운영 도메인의 발송 서버는 이 화면에서 변경할 수 없습니다."
            : code === "kavenix-sending-server-invalid"
              ? "변경할 발송 서버 값이 올바르지 않습니다."
              : code === "kavenix-sending-server-not-configured"
                ? "발송 서버 관리에 등록되어 있지 않거나 중지된 서버입니다."
                : "발송 서버를 변경하지 못했습니다. 잠시 후 다시 시도해주세요.";

    return Response.json(
      { error: code || "sending-server-update-failed", message },
      { status: code === "kavenix-domain-not-found" ? 404 : 400 },
    );
  }
}
