import { getSessionUser } from "@/lib/auth";
import { DOMAIN_SETUP_ASSISTANCE_FEE } from "@/lib/domain-setup-assistance";
import { getDomainSetupPromotionPreview } from "@/lib/domain-setup-promotions";
import { assertMailBillingManagementAccessByEmail } from "@/lib/toss-pay";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

const PROMOTION_MESSAGES: Record<string, string> = {
  "promotion-code-expired": "사용 기간이 종료된 프로모션 코드입니다.",
  "promotion-code-inactive": "현재 사용할 수 없는 프로모션 코드입니다.",
  "promotion-code-invalid-format": "프로모션 코드 형식을 확인해주세요.",
  "promotion-code-not-found": "프로모션 코드를 확인해주세요.",
  "promotion-code-not-started": "아직 사용할 수 없는 프로모션 코드입니다.",
  "promotion-code-required": "프로모션 코드를 입력해주세요.",
  "promotion-code-usage-limit": "프로모션 코드의 전체 사용 한도가 소진되었습니다.",
  "promotion-code-user-limit": "이 계정에서 사용할 수 있는 횟수를 모두 사용했습니다.",
};

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 { code?: unknown } | null;

  if (!payload) {
    return Response.json({ error: "invalid-json", ok: false }, { status: 400 });
  }

  try {
    await assertMailBillingManagementAccessByEmail(user.email);
    const promotion = await getDomainSetupPromotionPreview(
      user.email,
      String(payload.code ?? ""),
      DOMAIN_SETUP_ASSISTANCE_FEE,
    );
    return Response.json({ ok: true, promotion });
  } catch (error) {
    const code = error instanceof Error ? error.message : "promotion-code-check-failed";
    return Response.json(
      {
        error: code,
        message: PROMOTION_MESSAGES[code] ?? "프로모션 코드를 확인하지 못했습니다.",
        ok: false,
      },
      { status: code === "billing-management-forbidden" ? 403 : 400 },
    );
  }
}
