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

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 errorMessage(code: string) {
  switch (code) {
    case "kavenix-sending-server-label-invalid":
      return "서버 이름을 1~80자로 입력해주세요.";
    case "kavenix-sending-server-host-invalid":
      return "URL이 아닌 올바른 호스트명 또는 IP를 입력해주세요.";
    case "kavenix-sending-server-port-invalid":
      return "포트는 1~65535 사이의 숫자로 입력해주세요.";
    case "kavenix-sending-server-security-invalid":
      return "지원되는 보안 연결 방식을 선택해주세요.";
    case "kavenix-sending-server-tls-host-invalid":
      return "TLS 호스트명은 올바른 도메인 이름으로 입력해주세요.";
    default:
      return "발송 서버를 등록하지 못했습니다. 잠시 후 다시 시도해주세요.";
  }
}

export async function POST(request: Request) {
  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 body = await request.json().catch(() => ({}));

  try {
    const server = await createKavenixSendingServer(body);

    return Response.json({
      message: `${server.label} 발송 서버를 등록했습니다.`,
      ok: true,
      result: { server },
    });
  } catch (error) {
    const code = error instanceof Error ? error.message : "";

    return Response.json(
      {
        error: code || "sending-server-create-failed",
        message: errorMessage(code),
      },
      { status: 400 },
    );
  }
}
