
import { useState, useEffect, useCallback } from 'react';

/**
 * API 응답 타입 (Server Action 표준 형식)
 */
export interface ApiResponse<T> {
  success: boolean;
  data?: T;
  error?: string;
}

/**
 * 데이터 fetch 함수 타입
 */
export type FetchFunction<T> = (id: string | number) => Promise<ApiResponse<T>>;

export interface UseDetailDataOptions {
  /** fetch 건너뛰기 (등록 모드 등) */
  skip?: boolean;
  /** ID가 없어도 fetch (선택적) */
  allowNullId?: boolean;
}

export interface UseDetailDataReturn<T> {
  /** 로드된 데이터 */
  data: T | null;
  /** 데이터 직접 설정 (폼 리셋 등) */
  setData: (data: T | null) => void;
  /** 로딩 상태 */
  isLoading: boolean;
  /** 에러 메시지 */
  error: string | null;
  /** 에러 설정 */
  setError: (error: string | null) => void;
  /** 데이터 새로고침 */
  refetch: () => Promise<void>;
  /** 로드 성공 여부 */
  isSuccess: boolean;
  /** 로드 실패 여부 */
  isError: boolean;
}

/**
 * 상세 데이터 로딩 훅
 *
 * ID 기반으로 데이터를 fetch하고 로딩/에러 상태를 관리합니다.
 *
 * @example
 * ```tsx
 * // 기본 사용
 * const { data, isLoading, error } = useDetailData(id, getBankAccount);
 *
 * // 등록 모드에서 skip
 * const { data, isLoading } = useDetailData(id, getBankAccount, { skip: isCreateMode });
 *
 * // 데이터 새로고침
 * const { data, refetch } = useDetailData(id, getBankAccount);
 * await refetch();
 * ```
 */
export function useDetailData<T>(
  id: string | number | null | undefined,
  fetchFn: FetchFunction<T>,
  options: UseDetailDataOptions = {}
): UseDetailDataReturn<T> {
  const { skip = false, allowNullId = false } = options;

  const [data, setData] = useState<T | null>(null);
  const [isLoading, setIsLoading] = useState(!skip && (!!id || allowNullId));
  const [error, setError] = useState<string | null>(null);

  // fetch 함수
  const fetchData = useCallback(async () => {
    // skip 조건 체크
    if (skip) {
      setIsLoading(false);
      return;
    }

    // ID 체크 (allowNullId가 false면 ID 필수)
    if (!id && !allowNullId) {
      setIsLoading(false);
      return;
    }

    setIsLoading(true);
    setError(null);

    try {
      const result = await fetchFn(id as string | number);

      if (result.success && result.data) {
        setData(result.data);
      } else {
        setError(result.error || '데이터를 불러오는데 실패했습니다.');
        setData(null);
      }
    } catch (err) {
      console.error('[useDetailData] Fetch error:', err);
      setError(err instanceof Error ? err.message : '알 수 없는 오류가 발생했습니다.');
      setData(null);
    } finally {
      setIsLoading(false);
    }
  }, [id, fetchFn, skip, allowNullId]);

  // ID 변경 시 자동 fetch
  useEffect(() => {
    fetchData();
  }, [fetchData]);

  // refetch 함수 (외부에서 호출 가능)
  const refetch = useCallback(async () => {
    await fetchData();
  }, [fetchData]);

  return {
    data,
    setData,
    isLoading,
    error,
    setError,
    refetch,
    isSuccess: !isLoading && !error && data !== null,
    isError: !isLoading && error !== null,
  };
}
