/**
 * DataTable 공통 컴포넌트 타입 정의
 *
 * 모든 목록 페이지에서 재사용 가능한 테이블 컴포넌트
 */

import type { ReactNode } from 'react';
import type { LucideIcon } from 'lucide-react';

// ===== 기본 타입 =====

/** 데이터 항목의 기본 인터페이스 */
export interface BaseDataItem {
  id: string;
  [key: string]: unknown;
}

/** 컬럼 정렬 방향 */
export type SortDirection = 'asc' | 'desc' | null;

/** 컬럼 정렬 상태 */
export interface SortState {
  column: string | null;
  direction: SortDirection;
}

// ===== 컬럼 정의 =====

/** 컬럼 정의 인터페이스 */
export interface ColumnDef<T extends BaseDataItem> {
  /** 컬럼 키 (데이터 필드명) */
  key: string;
  /** 컬럼 헤더 텍스트 */
  header: string;
  /** 컬럼 너비 (CSS 값) */
  width?: string;
  /** 최소 너비 */
  minWidth?: string;
  /** 정렬 가능 여부 */
  sortable?: boolean;
  /** 모바일에서 숨김 여부 */
  hideOnMobile?: boolean;
  /** 태블릿에서 숨김 여부 */
  hideOnTablet?: boolean;
  /** 텍스트 정렬 */
  align?: 'left' | 'center' | 'right';
  /** 셀 렌더링 함수 */
  render?: (value: unknown, row: T, index: number) => ReactNode;
  /** 모바일 카드에서의 렌더링 (null이면 표시 안함) */
  renderMobile?: (value: unknown, row: T, index: number) => ReactNode | null;
}

// ===== 검색/필터 =====

/** 필터 옵션 */
export interface FilterOption {
  value: string;
  label: string;
  count?: number;
}

/** 탭 필터 설정 */
export interface TabFilter {
  key: string;
  options: FilterOption[];
}

/** 검색 설정 */
export interface SearchConfig {
  placeholder?: string;
  /** 검색 대상 필드 키 배열 */
  searchFields?: string[];
}

// ===== 선택 =====

/** 선택 설정 */
export interface SelectionConfig {
  /** 선택 기능 활성화 */
  enabled: boolean;
  /** 단일 선택 모드 */
  single?: boolean;
}

// ===== 페이지네이션 =====

/** 페이지네이션 설정 */
export interface PaginationConfig {
  /** 페이지당 항목 수 */
  pageSize: number;
  /** 페이지 사이즈 옵션 */
  pageSizeOptions?: number[];
  /** 페이지 사이즈 변경 가능 여부 */
  showPageSizeSelector?: boolean;
}

// ===== 액션 버튼 =====

/** 행 액션 정의 */
export interface RowAction<T extends BaseDataItem> {
  key: string;
  icon?: LucideIcon;
  label?: string;
  tooltip?: string;
  variant?: 'default' | 'ghost' | 'outline' | 'destructive';
  /** 표시 조건 */
  visible?: (row: T) => boolean;
  /** 클릭 핸들러 */
  onClick: (row: T) => void;
}

/** 벌크 액션 정의 (선택된 항목에 대한 액션) */
export interface BulkAction<T extends BaseDataItem> {
  key: string;
  icon?: LucideIcon;
  label: string;
  variant?: 'default' | 'outline' | 'destructive';
  /** 활성화 조건 (선택된 항목 수) */
  minSelected?: number;
  /** 클릭 핸들러 */
  onClick: (selectedItems: T[]) => void;
}

// ===== 통계 카드 =====

/** 통계 카드 항목 */
export interface StatItem {
  label: string;
  value: number | string;
  icon?: LucideIcon;
  iconColor?: string;
  /** 클릭 시 해당 필터로 이동 */
  filterValue?: string;
}

// ===== 빈 상태 =====

/** 빈 상태 설정 */
export interface EmptyStateConfig {
  /** 빈 상태 아이콘 */
  icon?: LucideIcon;
  /** 빈 상태 제목 */
  title?: string;
  /** 빈 상태 설명 */
  description?: string;
  /** 필터 적용 시 빈 상태 제목 */
  filteredTitle?: string;
  /** 필터 적용 시 빈 상태 설명 */
  filteredDescription?: string;
}

// ===== 메인 Props =====

/** DataTable 메인 Props */
export interface DataTableProps<T extends BaseDataItem> {
  /** 데이터 배열 */
  data: T[];
  /** 컬럼 정의 */
  columns: ColumnDef<T>[];
  /** 로딩 상태 */
  loading?: boolean;

  // === 검색/필터 ===
  /** 검색 설정 */
  search?: SearchConfig;
  /** 탭 필터 설정 */
  tabFilter?: TabFilter;
  /** 기본 필터 값 */
  defaultFilterValue?: string;

  // === 선택 ===
  /** 선택 설정 */
  selection?: SelectionConfig;
  /** 선택 변경 핸들러 */
  onSelectionChange?: (selectedIds: Set<string>) => void;

  // === 페이지네이션 ===
  /** 페이지네이션 설정 */
  pagination?: PaginationConfig;

  // === 정렬 ===
  /** 기본 정렬 */
  defaultSort?: SortState;
  /** 정렬 변경 핸들러 (서버 사이드 정렬용) */
  onSortChange?: (sort: SortState) => void;

  // === 액션 ===
  /** 행 액션 */
  rowActions?: RowAction<T>[];
  /** 벌크 액션 */
  bulkActions?: BulkAction<T>[];

  // === 스타일 ===
  /** 테이블 최소 높이 */
  minHeight?: string;
  /** 스트라이프 스타일 */
  striped?: boolean;
  /** 호버 스타일 */
  hoverable?: boolean;

  // === 빈 상태 ===
  /** 빈 상태 설정 */
  emptyState?: EmptyStateConfig;

  // === 기타 ===
  /** 행 클릭 핸들러 */
  onRowClick?: (row: T) => void;
  /** 행 키 추출 함수 (기본: row.id) */
  getRowKey?: (row: T) => string;
}

// ===== 서브 컴포넌트 Props =====

/** SearchFilter Props */
export interface SearchFilterProps {
  searchValue: string;
  onSearchChange: (value: string) => void;
  searchConfig?: SearchConfig;
  filterValue?: string;
  onFilterChange?: (value: string) => void;
  filterOptions?: FilterOption[];
}

/** Pagination Props */
export interface PaginationProps {
  currentPage: number;
  totalPages: number;
  totalItems: number;
  startIndex: number;
  endIndex: number;
  onPageChange: (page: number) => void;
  pageSize?: number;
  onPageSizeChange?: (size: number) => void;
  pageSizeOptions?: number[];
}

/** TabFilter Props */
export interface TabFilterProps {
  value: string;
  onChange: (value: string) => void;
  options: FilterOption[];
}

/** StatCards Props */
export interface StatCardsProps {
  stats: StatItem[];
  onStatClick?: (filterValue: string) => void;
}