import { getSessionUser } from "@/lib/auth";
import {
  activateTossPaySubscriptionForOwnerEmail,
  assertMailBillingManagementAccessByEmail,
  pauseTossPaySubscriptionForOwnerEmail,
} from "@/lib/toss-pay";

type SubscriptionActionRequest = {
  action?: "activate" | "pause";
};

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

  if (!user) {
    return Response.json(
      { error: "unauthorized", message: "로그인이 필요합니다." },
      { status: 401 },
    );
  }

  let payload: SubscriptionActionRequest | null = null;

  try {
    payload = (await request.json()) as SubscriptionActionRequest;
  } catch {
    return Response.json(
      { error: "invalid-json", message: "JSON 본문이 필요합니다." },
      { status: 400 },
    );
  }

  if (payload?.action !== "activate" && payload?.action !== "pause") {
    return Response.json(
      { error: "invalid-action", message: "action 값은 activate 또는 pause 여야 합니다." },
      { status: 400 },
    );
  }

  try {
    await assertMailBillingManagementAccessByEmail(user.email);

    const subscription =
      payload.action === "activate"
        ? await activateTossPaySubscriptionForOwnerEmail(user.email)
        : await pauseTossPaySubscriptionForOwnerEmail(user.email);

    return Response.json({
      ok: true,
      subscription,
    });
  } catch (error) {
    return Response.json(
      {
        error: "subscription-action-failed",
        message:
          error instanceof Error ? error.message : "정기결제 상태 변경에 실패했습니다.",
      },
      { status: error instanceof Error && error.message === "billing-management-forbidden" ? 403 : 400 },
    );
  }
}
