import { getSessionUser } from "@/lib/auth";
import {
  revokePendingMailBillingCancellationByOwnerEmail,
  requestMailBillingCancellationByOwnerEmail,
  type MailBillingCancellationRequestKind,
} from "@/lib/billing-cancellation";
import { assertMailBillingManagementAccessByEmail } from "@/lib/toss-pay";

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 },
    );
  }

  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);

    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 : "billing-cancellation-request-failed",
      },
      { status: error instanceof Error && error.message === "billing-management-forbidden" ? 403 : 400 },
    );
  }
}

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

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

  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 },
    );
  }
}
