import { useCallback, useRef } from 'react';
import { printElement, printArea } from '@/lib/print-utils';

interface UsePrintHandlerOptions {
  /** 인쇄 제목 (브라우저 다이얼로그에 표시) */
  title?: string;
  /** 추가 CSS 스타일 */
  styles?: string;
}

interface UsePrintHandlerReturn {
  /** ref를 할당한 요소를 인쇄 */
  printRef: React.RefObject<HTMLDivElement | null>;
  /** ref 기반 인쇄 실행 */
  handlePrint: () => void;
  /** .print-area 클래스 기반 인쇄 실행 */
  handlePrintArea: () => void;
}

/**
 * 문서 인쇄 훅
 *
 * ref 기반 또는 .print-area 기반으로 인쇄를 실행합니다.
 *
 * @example
 * // ref 기반 사용
 * function MyDocument() {
 *   const { printRef, handlePrint } = usePrintHandler({ title: '발주서' });
 *   return (
 *     <>
 *       <DocumentWrapper ref={printRef}>
 *         <DocumentHeader title="발주서" />
 *         ...
 *       </DocumentWrapper>
 *       <Button onClick={handlePrint}>인쇄</Button>
 *     </>
 *   );
 * }
 *
 * @example
 * // .print-area 기반 사용 (DocumentWrapper의 printArea prop 활용)
 * function MyDocument() {
 *   const { handlePrintArea } = usePrintHandler({ title: '검사 성적서' });
 *   return (
 *     <>
 *       <DocumentWrapper>...</DocumentWrapper>
 *       <Button onClick={handlePrintArea}>인쇄</Button>
 *     </>
 *   );
 * }
 */
export function usePrintHandler(options: UsePrintHandlerOptions = {}): UsePrintHandlerReturn {
  const { title = '문서 인쇄', styles } = options;
  const printRef = useRef<HTMLDivElement | null>(null);

  const handlePrint = useCallback(() => {
    if (printRef.current) {
      printElement(printRef.current, { title, styles });
    }
  }, [title, styles]);

  const handlePrintArea = useCallback(() => {
    printArea({ title, styles });
  }, [title, styles]);

  return { printRef, handlePrint, handlePrintArea };
}
