import { revalidatePath } from "next/cache";
import { getSessionUser } from "@/lib/auth";
import {
  createKavenixDomainSetupPromotionCode,
  getKavenixDomainSetupPromotionCodes,
} from "@/lib/domain-setup-promotions";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";

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

type CreatePayload = {
  code?: unknown;
  discountType?: unknown;
  discountValue?: unknown;
  expiresAt?: unknown;
  label?: unknown;
  perUserLimit?: unknown;
  startsAt?: unknown;
  usageLimit?: unknown;
};

const ERROR_MESSAGES: Record<string, string> = {
  "promotion-code-duplicate": "이미 등록된 프로모션 코드입니다.",
  "promotion-code-invalid-discount": "할인 방식과 할인값을 확인해주세요.",
  "promotion-code-invalid-format": "코드는 영문 대문자, 숫자, 밑줄, 하이픈으로 3~64자까지 입력해주세요.",
  "promotion-code-invalid-limit": "사용 한도를 확인해주세요.",
  "promotion-code-invalid-period": "사용 기간을 확인해주세요.",
  "promotion-code-label-required": "프로모션 이름을 입력해주세요.",
};

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

  if (!user || !isKavenixAdminEmail(user.email)) {
    return Response.json({ error: "forbidden", ok: false }, { status: 403 });
  }

  const payload = (await request.json().catch(() => null)) as CreatePayload | null;

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

  try {
    await createKavenixDomainSetupPromotionCode({
      code: payload.code,
      createdByEmail: user.email,
      discountType: payload.discountType,
      discountValue: payload.discountValue,
      expiresAt: payload.expiresAt,
      label: payload.label,
      perUserLimit: payload.perUserLimit,
      startsAt: payload.startsAt,
      usageLimit: payload.usageLimit,
    });
    const codes = await getKavenixDomainSetupPromotionCodes();
    revalidatePath("/kavenix");
    return Response.json({ codes, ok: true });
  } catch (error) {
    const code = error instanceof Error ? error.message : "promotion-code-create-failed";
    return Response.json(
      {
        error: code,
        message: ERROR_MESSAGES[code] ?? "프로모션 코드 발급에 실패했습니다.",
        ok: false,
      },
      { status: 400 },
    );
  }
}
