import { getSessionUser } from "@/lib/auth";
import { resolveMailBillingProvider } from "@/lib/billing-region-server";
import {
  revokePendingMailBillingCancellationByOwnerEmail,
  requestMailBillingCancellationByOwnerEmail,
  type MailBillingCancellationRequestKind,
} from "@/lib/billing-cancellation";
import { assertMailBillingManagementAccessByEmail } from "@/lib/toss-pay";
import {
  assertDomainAssistanceAllowsBillingChangesByOwnerEmail,
  DOMAIN_ASSISTANCE_BILLING_LOCK_ERROR,
} from "@/lib/domain-assistance-billing-lock";

type CancellationRequestPayload = {
  kind?: MailBillingCancellationRequestKind;
};

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

  if (!user) {
    return Response.json(
      {
        error: "unauthorized",
        message: "login-required",
      },
      { status: 401 },
    );
  }

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

  let payload: CancellationRequestPayload | null = null;

  try {
    payload = (await request.json()) as CancellationRequestPayload;
  } catch {
    return Response.json(
      {
        error: "invalid-json",
        message: "invalid-json",
      },
      { status: 400 },
    );
  }

  if (payload?.kind !== "cancel_only" && payload?.kind !== "withdrawal_refund") {
    return Response.json(
      {
        error: "invalid-kind",
        message: "billing-cancellation-kind-invalid",
      },
      { status: 400 },
    );
  }

  try {
    await assertMailBillingManagementAccessByEmail(user.email);
    await assertDomainAssistanceAllowsBillingChangesByOwnerEmail(user.email);

    const cancellation = await requestMailBillingCancellationByOwnerEmail({
      email: user.email,
      kind: payload.kind,
      requestedByEmail: user.email,
    });

    return Response.json({
      cancellation,
      message: cancellation.message,
      ok: true,
    });
  } catch (error) {
    return Response.json(
      {
        error: "billing-cancellation-request-failed",
        message:
          error instanceof Error
            ? error.message === DOMAIN_ASSISTANCE_BILLING_LOCK_ERROR
              ? "도메인 설정 대행 처리 중에는 결제수단을 변경하거나 삭제할 수 없습니다."
              : error.message
            : "billing-cancellation-request-failed",
      },
      {
        status:
          error instanceof Error && error.message === "billing-management-forbidden"
            ? 403
            : error instanceof Error && error.message === DOMAIN_ASSISTANCE_BILLING_LOCK_ERROR
              ? 409
              : 400,
      },
    );
  }
}

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

  if (!user) {
    return Response.json(
      {
        error: "unauthorized",
        message: "login-required",
      },
      { status: 401 },
    );
  }

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

  try {
    await assertMailBillingManagementAccessByEmail(user.email);

    const cancellation = await revokePendingMailBillingCancellationByOwnerEmail({
      email: user.email,
      requestedByEmail: user.email,
    });

    return Response.json({
      cancellation,
      message: cancellation.message,
      ok: true,
    });
  } catch (error) {
    return Response.json(
      {
        error: "billing-cancellation-revoke-failed",
        message:
          error instanceof Error ? error.message : "billing-cancellation-revoke-failed",
      },
      { status: error instanceof Error && error.message === "billing-management-forbidden" ? 403 : 400 },
    );
  }
}
