import { getSessionUser } from "@/lib/auth";
import { resolveMailBillingProvider } from "@/lib/billing-region-server";
import { assertMailBillingManagementAccessByEmail } from "@/lib/toss-pay";
import { resolveOriginFromHeaders } from "@/lib/mail-urls";
import { createTossPayBillingRegistrationForOwnerEmail } from "@/lib/toss-pay";
import {
  assertDomainAssistanceAllowsBillingChangesByOwnerEmail,
  DOMAIN_ASSISTANCE_BILLING_LOCK_ERROR,
} from "@/lib/domain-assistance-billing-lock";

export async function POST(request: Request) {
  const user = await getSessionUser();

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

  if (resolveMailBillingProvider(request.headers, user.preferredLocale) !== "toss-pay") {
    return Response.json(
      {
        error: "toss-pay-billing-unavailable",
        message: "해외 접속에서는 Polar 카드 결제를 이용해주세요.",
      },
      { status: 403 },
    );
  }

  try {
    const payload = (await request.json().catch(() => null)) as {
      appToApp?: unknown;
      intent?: unknown;
    } | null;
    const intent = payload?.intent === "domain-assistance" ? "domain-assistance" : "billing";
    await assertMailBillingManagementAccessByEmail(user.email);
    await assertDomainAssistanceAllowsBillingChangesByOwnerEmail(user.email);

    const registration = await createTossPayBillingRegistrationForOwnerEmail({
      email: user.email,
      intent,
      origin: resolveOriginFromHeaders(request.headers, request.url),
      retAppScheme: payload?.appToApp === true ? "officialmail://billing" : undefined,
    });

    return Response.json({
      ok: true,
      registration,
    });
  } catch (error) {
    return Response.json(
      {
        error: "billing-registration-failed",
        message:
          error instanceof Error
            ? error.message === DOMAIN_ASSISTANCE_BILLING_LOCK_ERROR
              ? "도메인 설정 대행 처리 중에는 결제수단을 변경하거나 삭제할 수 없습니다."
              : error.message
            : "토스페이 자동결제 등록 요청에 실패했습니다.",
      },
      {
        status:
          error instanceof Error && error.message === "billing-management-forbidden"
            ? 403
            : error instanceof Error && error.message === DOMAIN_ASSISTANCE_BILLING_LOCK_ERROR
              ? 409
              : 400,
      },
    );
  }
}
