/*
 * 범용 그리드 PDF 출력 버튼 — 전 데이터 그리드 공용(소유자 지시: "그리드는 항상 PDF 출력 버튼").
 * 자기완결형(전역 토스트 provider 불요): busy 상태 + 실패 시 인라인 토스트(.kx-toast) 노출.
 * KxDataTable 내장 및 커스텀 .kx-table 그리드 어디서나 배치 가능.
 *
 * Nifty 문자 그대로: .kx-dt__csv 버튼 스타일 재사용(CSV 버튼과 동일 톤), kx 토큰. 하드코딩 0.
 */
import { useCallback, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { IconDocument } from './ui/icons';
import { downloadGridPdf, type GridPdfColumn } from './gridPdf';

export interface GridPdfButtonProps {
  /** 리포트 제목(= 화면 타이틀, 파일명 base). */
  title: string;
  subtitle?: string;
  columns: GridPdfColumn[];
  /** 현재 표시 중인 행(필터·정렬 반영). 지연 생성 위해 함수도 허용. */
  rows: Record<string, unknown>[] | (() => Record<string, unknown>[]);
  disabled?: boolean;
  className?: string;
  /** 버튼 라벨(기본 datatable.pdf). */
  label?: string;
}

export function GridPdfButton({
  title,
  subtitle,
  columns,
  rows,
  disabled,
  className = '',
  label,
}: GridPdfButtonProps) {
  const { t } = useTranslation();
  const [busy, setBusy] = useState(false);
  const [err, setErr] = useState<string | null>(null);

  const onClick = useCallback(async () => {
    if (busy) return;
    setBusy(true);
    setErr(null);
    try {
      const data = typeof rows === 'function' ? rows() : rows;
      await downloadGridPdf({ title, subtitle, columns, rows: data });
    } catch (e) {
      const msg = e instanceof Error ? e.message : t('datatable.pdfError', { defaultValue: 'PDF 출력에 실패했습니다.' });
      setErr(msg);
      window.setTimeout(() => setErr(null), 2600);
    } finally {
      setBusy(false);
    }
  }, [busy, rows, title, subtitle, columns, t]);

  return (
    <>
      <button
        type="button"
        className={`kx-dt__csv ${className}`}
        onClick={onClick}
        disabled={disabled || busy}
        title={t('datatable.pdfTitle', { defaultValue: 'PDF 출력' })}
      >
        <IconDocument size={16} />
        {busy ? t('datatable.pdfBusy', { defaultValue: '출력 중…' }) : (label ?? t('datatable.pdf', { defaultValue: 'PDF' }))}
      </button>
      {err && (
        <div className="kx-toast" role="alert">
          {err}
        </div>
      )}
    </>
  );
}
