"use client";

import { useRouter } from "next/navigation";
import { useState } from "react";

type KavenixChargeRefundButtonProps = {
  chargeId: number;
  className?: string;
  disabled?: boolean;
  disabledReason?: string;
  label?: string;
};

type RefundApiResponse = {
  message?: string;
  ok?: boolean;
};

export function KavenixChargeRefundButton({
  chargeId,
  className,
  disabled = false,
  disabledReason,
  label = "전액 환불",
}: KavenixChargeRefundButtonProps) {
  const router = useRouter();
  const [busy, setBusy] = useState(false);

  async function handleClick() {
    if (disabled || busy) {
      if (disabledReason) {
        window.alert(disabledReason);
      }
      return;
    }

    const reason = window.prompt("환불 사유를 입력하세요.", "최고관리자 환불");

    if (reason === null) {
      return;
    }

    const trimmedReason = reason.trim();

    if (!window.confirm("이 결제를 환불 처리할까요?")) {
      return;
    }

    setBusy(true);

    try {
      const response = await fetch(`/api/kavenix/charges/${chargeId}/refund`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          reason: trimmedReason || "최고관리자 환불",
        }),
      });

      const payload = (await response.json()) as RefundApiResponse;

      if (!response.ok || payload.ok !== true) {
        throw new Error(payload.message || "환불 처리에 실패했습니다.");
      }

      window.alert(payload.message || "환불이 처리되었습니다.");
      router.refresh();
    } catch (error) {
      window.alert(error instanceof Error ? error.message : "환불 처리에 실패했습니다.");
    } finally {
      setBusy(false);
    }
  }

  return (
    <button
      type="button"
      onClick={handleClick}
      disabled={disabled || busy}
      className={className}
    >
      {busy ? "처리 중..." : label}
    </button>
  );
}
