import { getSessionUser } from "@/lib/auth";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";
import { refundTossPayChargeById } from "@/lib/toss-pay";

type RefundRequestPayload = {
  reason?: string | null;
};

export async function POST(
  request: Request,
  context: RouteContext<"/api/kavenix/charges/[chargeId]/refund">,
) {
  const user = await getSessionUser();

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

  if (!isKavenixAdminEmail(user.email)) {
    return Response.json(
      {
        error: "forbidden",
        message: "최고관리자만 결제 환불을 처리할 수 있습니다.",
      },
      { status: 403 },
    );
  }

  const { chargeId } = await context.params;
  const numericChargeId = Number(chargeId);

  if (!Number.isInteger(numericChargeId) || numericChargeId <= 0) {
    return Response.json(
      {
        error: "invalid-charge-id",
        message: "유효한 결제 ID가 아닙니다.",
      },
      { status: 400 },
    );
  }

  let payload: RefundRequestPayload = {};

  try {
    payload = (await request.json()) as RefundRequestPayload;
  } catch {
    payload = {};
  }

  try {
    const refund = await refundTossPayChargeById({
      chargeId: numericChargeId,
      reason: payload.reason,
      requestedByEmail: user.email,
    });

    return Response.json({
      message: `${refund.amount.toLocaleString("ko-KR")}원 환불이 처리되었습니다.`,
      ok: true,
      refund,
    });
  } catch (error) {
    return Response.json(
      {
        error: "refund-failed",
        message: error instanceof Error ? error.message : "환불 처리에 실패했습니다.",
      },
      { status: 400 },
    );
  }
}
