import { getSessionUser } from "@/lib/auth";
import { isKoreanCommerceRequest } from "@/lib/billing-region-server";
import {
  createDomainSetupAssistanceRequest,
  getDomainSetupAssistanceByOwnerEmail,
} from "@/lib/domain-setup-assistance";
import {
  assertMailBillingManagementAccessByEmail,
  getMailBillingOverviewByOwnerEmail,
} from "@/lib/toss-pay";

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

type RequestPayload = {
  accountIdentifier?: unknown;
  accountPassword?: unknown;
  consented?: unknown;
  note?: unknown;
  notificationEmail?: unknown;
  paymentConsented?: unknown;
  promotionCode?: unknown;
  provider?: unknown;
};

function errorResponse(error: unknown) {
  const code = error instanceof Error ? error.message : "domain-assistance-save-failed";
  const messages: Record<string, string> = {
    "domain-assistance-already-requested": "이미 처리 중인 설정 대행 신청이 있습니다.",
    "domain-assistance-consent-required": "개인정보 수집·이용에 동의해주세요.",
    "domain-assistance-payment-consent-required": "연결 완료 후 자동결제에 동의해주세요.",
    "domain-assistance-billing-profile-required": "설정 대행을 신청하려면 결제카드를 먼저 등록해주세요.",
    "domain-assistance-domain-required": "도메인을 먼저 등록해주세요.",
    "domain-assistance-invalid-notification-email": "올바른 완료 알림 이메일 주소를 입력해주세요.",
    "domain-assistance-required-fields": "도메인 구매처와 계정정보를 모두 입력해주세요.",
    "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": "이 계정에서 사용할 수 있는 횟수를 모두 사용했습니다.",
    "billing-management-forbidden": "도메인 대표 관리자 계정에서만 설정 대행을 신청할 수 있습니다.",
    "domain-assistance-region-unavailable": "도메인 연결 설정 대행은 대한민국에서만 이용할 수 있습니다.",
  };
  const status =
    code === "billing-management-forbidden" || code === "domain-assistance-region-unavailable"
      ? 403
      : code === "domain-assistance-already-requested"
        ? 409
        : 400;

  return Response.json(
    {
      error: code,
      message: messages[code] ?? "설정 대행 신청 접수에 실패했습니다.",
      ok: false,
    },
    {
      status:
        code.startsWith("domain-assistance-") || code === "billing-management-forbidden"
          ? status
          : 500,
    },
  );
}

function assertDomainSetupAssistanceRegion(request: Request, preferredLocale?: string | null) {
  if (!isKoreanCommerceRequest(request.headers, preferredLocale)) {
    throw new Error("domain-assistance-region-unavailable");
  }
}

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

  if (!user) {
    return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  }

  try {
    assertDomainSetupAssistanceRegion(request, user.preferredLocale);
    await assertMailBillingManagementAccessByEmail(user.email);
    const [assistanceRequest, billingOverview] = await Promise.all([
      getDomainSetupAssistanceByOwnerEmail(user.email),
      getMailBillingOverviewByOwnerEmail(user.email, { recoverRemoteStatus: true }),
    ]);
    const profile = billingOverview?.profile;
    const paymentMethodRegistered =
      profile?.status === "active" &&
      profile.payMethod === "CARD" &&
      Boolean(profile.billingKey);
    const paymentMethodLabel = paymentMethodRegistered
      ? profile?.payMethod === "CARD"
        ? `${profile.cardCompanyName || "결제카드"}${profile.cardNum4Print ? ` · ${profile.cardNum4Print}` : ""}`
        : profile?.accountBankName || "등록된 결제수단"
      : null;

    return Response.json({
      ok: true,
      paymentMethod: {
        label: paymentMethodLabel,
        registered: paymentMethodRegistered,
      },
      request: assistanceRequest,
    });
  } catch (error) {
    return errorResponse(error);
  }
}

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 RequestPayload | null;

  if (!payload) {
    return Response.json(
      { error: "invalid-json", message: "신청 정보를 다시 확인해주세요.", ok: false },
      { status: 400 },
    );
  }

  try {
    assertDomainSetupAssistanceRegion(request, user.preferredLocale);
    await assertMailBillingManagementAccessByEmail(user.email);
    const savedRequest = await createDomainSetupAssistanceRequest(user.email, {
      accountIdentifier: String(payload.accountIdentifier ?? ""),
      accountPassword: String(payload.accountPassword ?? ""),
      consented: payload.consented === true,
      note: String(payload.note ?? ""),
      notificationEmail: String(payload.notificationEmail ?? ""),
      paymentConsented: payload.paymentConsented === true,
      promotionCode: String(payload.promotionCode ?? ""),
      provider: String(payload.provider ?? ""),
    });

    return Response.json({ ok: true, request: savedRequest });
  } catch (error) {
    return errorResponse(error);
  }
}
