import { ReactNode } from 'react';

// =============================================================================
// 공통 Props
// =============================================================================

interface BaseProps<T> {
  /** 모달 열림 상태 */
  open: boolean;
  /** 모달 열림/닫힘 제어 */
  onOpenChange: (open: boolean) => void;
  /** 모달 제목 */
  title: ReactNode;
  /** 검색 placeholder */
  searchPlaceholder?: string;
  /** 데이터 조회 함수 (검색어 → 결과 배열) */
  fetchData: (query: string) => Promise<T[]>;
  /** 고유 키 추출 */
  keyExtractor: (item: T) => string;
  /** 아이템 렌더링 (isDisabled: 비활성 상태) */
  renderItem: (item: T, isSelected: boolean, isDisabled?: boolean) => ReactNode;
  /** 아이템 비활성 조건 (선택된 아이템 목록 기반) */
  isItemDisabled?: (item: T, selectedItems: T[]) => boolean;

  // 검색 설정
  /** 검색 모드: debounce(자동) vs enter(수동) */
  searchMode?: 'debounce' | 'enter';
  /** 디바운스 딜레이 (ms) - searchMode='debounce'일 때 */
  debounceDelay?: number;
  /** 검색어 유효성 검사 (false면 검색 안 함) */
  validateSearch?: (query: string) => boolean;
  /** 유효하지 않은 검색어일 때 메시지 */
  invalidSearchMessage?: string;
  /** 모달 열릴 때 자동 로드 여부 */
  loadOnOpen?: boolean;
  /** 검색어 없을 때 안내 메시지 */
  emptyQueryMessage?: string;
  /** 검색 결과 없을 때 메시지 */
  noResultMessage?: string;
  /** 로딩 메시지 */
  loadingMessage?: string;

  // 레이아웃
  /** Dialog 최대 너비 클래스 */
  dialogClassName?: string;
  /** 리스트 컨테이너 클래스 */
  listContainerClassName?: string;
  /** 리스트 래퍼 (Table 헤더 등 커스텀 구조) */
  listWrapper?: (children: ReactNode, selectState?: {
    isAllSelected: boolean;
    onToggleAll: () => void;
  }) => ReactNode;
  /** 푸터 상단 정보 영역 (예: "총 X건") */
  infoText?: (items: T[], isLoading: boolean) => ReactNode;
}

// =============================================================================
// 단일 선택
// =============================================================================

export interface SingleSelectProps<T> extends BaseProps<T> {
  mode: 'single';
  onSelect: (item: T) => void;
}

// =============================================================================
// 다중 선택
// =============================================================================

export interface MultipleSelectProps<T> extends BaseProps<T> {
  mode: 'multiple';
  onSelect: (items: T[]) => void;
  /** 확인 버튼 라벨 (기본: "선택") */
  confirmLabel?: string;
  /** 전체선택 허용 */
  allowSelectAll?: boolean;
  /** 헤더 영역 (전체선택 체크박스 등) */
  renderHeader?: (params: {
    isAllSelected: boolean;
    onToggleAll: () => void;
  }) => ReactNode;
}

export type SearchableSelectionModalProps<T> =
  | SingleSelectProps<T>
  | MultipleSelectProps<T>;
