"use client";

import { ComponentConfig } from "@/types/component";

/**
 * Entity 조인 정보
 */
export interface EntityJoinInfo {
  sourceTable: string;
  sourceColumn: string;
  joinAlias: string;
}

/**
 * 자동생성 타입 정의
 */
export type AutoGenerationType =
  | "uuid" // UUID 생성
  | "current_user" // 현재 사용자 ID
  | "current_time" // 현재 시간
  | "sequence" // 시퀀스 번호
  | "numbering_rule" // 채번 규칙
  | "random_string" // 랜덤 문자열
  | "random_number" // 랜덤 숫자
  | "company_code" // 회사 코드
  | "department" // 부서 코드
  | "none"; // 자동생성 없음

/**
 * 자동생성 설정
 */
export interface AutoGenerationConfig {
  type: AutoGenerationType;
  enabled: boolean;
  options?: {
    length?: number; // 랜덤 문자열/숫자 길이
    prefix?: string; // 접두사
    suffix?: string; // 접미사
    format?: string; // 시간 형식 (current_time용)
    startValue?: number; // 시퀀스 시작값
    numberingRuleId?: string; // 채번 규칙 ID (numbering_rule 타입용)
  };
}

/**
 * 테이블 컬럼 설정
 */
export interface ColumnConfig {
  columnName: string;
  displayName: string;
  visible: boolean;
  sortable: boolean;
  searchable: boolean;
  width?: number;
  align: "left" | "center" | "right";
  format?: "text" | "number" | "date" | "currency" | "boolean";
  order: number;
  dataType?: string; // 컬럼 데이터 타입 (검색 컬럼 선택에 사용)
  isEntityJoin?: boolean; // Entity 조인된 컬럼인지 여부
  entityJoinInfo?: EntityJoinInfo; // Entity 조인 상세 정보

  // 숫자 포맷팅 설정
  thousandSeparator?: boolean; // 천단위 구분자 사용 여부 (기본: true)

  // 🎯 엔티티 컬럼 표시 설정 (화면별 동적 설정)
  entityDisplayConfig?: {
    displayColumns: string[]; // 표시할 컬럼들 (기본 테이블 + 조인 테이블)
    separator?: string; // 구분자 (기본: " - ")
    sourceTable?: string; // 기본 테이블명
    joinTable?: string; // 조인 테이블명
  };

  // 컬럼 고정 관련 속성
  fixed?: "left" | "right" | false; // 컬럼 고정 위치 (왼쪽, 오른쪽, 고정 안함)
  fixedOrder?: number; // 고정된 컬럼들 내에서의 순서

  // 새로운 기능들
  hidden?: boolean; // 숨김 기능 (편집기에서는 연하게, 실제 화면에서는 숨김)
  autoGeneration?: AutoGenerationConfig; // 자동생성 설정
  editable?: boolean; // 🆕 편집 가능 여부 (기본값: true, false면 인라인 편집 불가)

  // 🎯 추가 조인 컬럼 정보 (조인 탭에서 추가한 컬럼들)
  additionalJoinInfo?: {
    sourceTable: string; // 원본 테이블
    sourceColumn: string; // 원본 컬럼 (예: dept_code)
    referenceTable?: string; // 참조 테이블 (예: dept_info)
    joinAlias: string; // 조인 별칭 (예: dept_code_company_name)
  };
}

/**
 * 카드 디스플레이 설정
 */
export interface CardDisplayConfig {
  idColumn: string; // ID 컬럼 (사번 등)
  titleColumn: string; // 제목 컬럼 (이름 등)
  subtitleColumn?: string; // 부제목 컬럼 (부서 등)
  descriptionColumn?: string; // 설명 컬럼
  imageColumn?: string; // 이미지 컬럼
  cardsPerRow: number; // 한 행당 카드 수 (기본: 3)
  cardSpacing: number; // 카드 간격 (기본: 16px)
  showActions: boolean; // 액션 버튼 표시 여부
  cardHeight?: number; // 카드 높이 (기본: auto)
}

/**
 * 필터 설정
 */
export interface FilterConfig {
  enabled: boolean;
  // 사용할 필터 목록 (DataTableFilter 타입 사용)
  filters: Array<{
    columnName: string;
    widgetType: string;
    label: string;
    gridColumns: number;
    numberFilterMode?: "exact" | "range"; // 숫자 필터 모드
    codeCategory?: string;
    referenceTable?: string;
    referenceColumn?: string;
    displayColumn?: string;
  }>;
  // 필터와 리스트 사이 간격 (px 단위, 기본: 40)
  bottomSpacing?: number;
}

/**
 * 액션 설정
 */
export interface ActionConfig {
  showActions: boolean;
  actions: Array<{
    type: "view" | "edit" | "delete" | "custom";
    label: string;
    icon?: string;
    color?: string;
    confirmMessage?: string;
    targetScreen?: string;
  }>;
  bulkActions: boolean;
  bulkActionList: string[];
}

/**
 * 스타일 설정
 */
export interface TableStyleConfig {
  theme: "default" | "striped" | "bordered" | "minimal";
  headerStyle: "default" | "dark" | "light";
  rowHeight: "compact" | "normal" | "comfortable";
  alternateRows: boolean;
  hoverEffect: boolean;
  borderStyle: "none" | "light" | "heavy";
}

/**
 * 페이지네이션 설정
 */
export interface PaginationConfig {
  enabled: boolean;
  pageSize: number;
  showSizeSelector: boolean;
  showPageInfo: boolean;
  pageSizeOptions: number[];
}

/**
 * 툴바 버튼 표시 설정
 */
export interface ToolbarConfig {
  showEditMode?: boolean; // 즉시 저장/배치 모드 버튼
  showExcel?: boolean; // Excel 내보내기 버튼
  showPdf?: boolean; // PDF 내보내기 버튼
  showCopy?: boolean; // 복사 버튼
  showSearch?: boolean; // 검색 버튼
  showFilter?: boolean; // 필터 버튼
  showRefresh?: boolean; // 상단 툴바 새로고침 버튼
  showPaginationRefresh?: boolean; // 하단 페이지네이션 새로고침 버튼
}

/**
 * 체크박스 설정
 */
export interface CheckboxConfig {
  enabled: boolean; // 체크박스 활성화 여부
  multiple: boolean; // 다중 선택 가능 여부 (true: 체크박스, false: 라디오)
  position: "left" | "right"; // 체크박스 위치
  selectAll: boolean; // 전체 선택/해제 버튼 표시 여부
}

/**
 * 연결된 필터 설정
 * 다른 컴포넌트(셀렉트박스 등)의 값으로 테이블 데이터를 필터링
 */
export interface LinkedFilterConfig {
  sourceComponentId: string; // 소스 컴포넌트 ID (셀렉트박스 등)
  sourceField?: string; // 소스 컴포넌트에서 가져올 필드명 (기본: value)
  targetColumn: string; // 필터링할 테이블 컬럼명
  operator?: "equals" | "contains" | "in"; // 필터 연산자 (기본: equals)
  enabled?: boolean; // 활성화 여부 (기본: true)
}

/**
 * 제외 필터 설정
 * 다른 테이블에 이미 존재하는 데이터를 제외하고 표시
 * 예: 거래처에 이미 등록된 품목을 품목 선택 모달에서 제외
 */
export interface ExcludeFilterConfig {
  enabled: boolean; // 제외 필터 활성화 여부
  referenceTable: string; // 참조 테이블 (예: customer_item_mapping)
  referenceColumn: string; // 참조 테이블의 비교 컬럼 (예: item_id)
  sourceColumn: string; // 현재 테이블의 비교 컬럼 (예: item_number)
  filterColumn?: string; // 참조 테이블의 필터 컬럼 (예: customer_id)
  filterValueSource?: "url" | "formData" | "parentData"; // 필터 값 소스 (기본: url)
  filterValueField?: string; // 필터 값 필드명 (예: customer_code)
}

/**
 * TableList 컴포넌트 설정 타입
 */

import { DataFilterConfig } from "@/types/screen-management";

export interface TableListConfig extends ComponentConfig {
  // 표시 모드 설정
  displayMode?: "table" | "card"; // 기본: "table"

  // 카드 디스플레이 설정 (displayMode가 "card"일 때 사용)
  cardConfig?: CardDisplayConfig;

  // 테이블 기본 설정
  selectedTable?: string;
  tableName?: string;
  title?: string;
  showHeader: boolean;
  showFooter: boolean;

  // 🆕 커스텀 테이블 설정 (화면 메인 테이블과 다른 테이블 사용 시)
  customTableName?: string; // 컴포넌트가 사용할 커스텀 테이블명
  useCustomTable?: boolean; // true면 customTableName 사용, false면 화면 메인 테이블 사용
  isReadOnly?: boolean; // 읽기전용 여부 (조회용 테이블인 경우 true)

  // 체크박스 설정
  checkbox: CheckboxConfig;

  // 높이 설정
  height: "auto" | "fixed" | "viewport";
  fixedHeight?: number;

  // 컬럼 설정
  columns: ColumnConfig[];
  autoWidth: boolean;
  stickyHeader: boolean;

  // 가로 스크롤 및 컬럼 고정 설정
  horizontalScroll: {
    enabled: boolean; // 가로 스크롤 활성화 여부
    maxVisibleColumns?: number; // 스크롤 없이 표시할 최대 컬럼 수 (이 수를 넘으면 가로 스크롤)
    minColumnWidth?: number; // 컬럼 최소 너비 (px)
    maxColumnWidth?: number; // 컬럼 최대 너비 (px)
  };

  // 페이지네이션
  pagination: PaginationConfig & {
    currentPage?: number; // 현재 페이지 (추가)
  };

  // 필터 설정
  filter: FilterConfig;

  // 액션 설정
  actions: ActionConfig;

  // 스타일 설정
  tableStyle: TableStyleConfig;

  // 데이터 로딩
  autoLoad: boolean;
  refreshInterval?: number; // 초 단위

  // 🆕 툴바 버튼 표시 설정
  toolbar?: ToolbarConfig;

  // 🆕 컬럼 값 기반 데이터 필터링
  dataFilter?: DataFilterConfig;

  // 🆕 연결된 필터 (다른 컴포넌트 값으로 필터링)
  linkedFilters?: LinkedFilterConfig[];

  // 🆕 제외 필터 (다른 테이블에 이미 존재하는 데이터 제외)
  excludeFilter?: ExcludeFilterConfig;

  // 이벤트 핸들러
  onRowClick?: (row: any) => void;
  onRowDoubleClick?: (row: any) => void;
  onSelectionChange?: (selectedRows: any[]) => void;
  onPageChange?: (page: number, pageSize: number) => void;
  onSortChange?: (column: string, direction: "asc" | "desc") => void;
  onFilterChange?: (filters: any) => void;

  // 선택된 행 정보 전달 핸들러
  onSelectedRowsChange?: (selectedRows: any[], selectedRowsData: any[]) => void;
}

/**
 * 테이블 데이터 응답 타입
 */
export interface TableDataResponse {
  data: any[];
  pagination: {
    page: number;
    pageSize: number;
    total: number;
    totalPages: number;
  };
  columns?: Array<{
    name: string;
    type: string;
    nullable: boolean;
  }>;
}

/**
 * TableList 컴포넌트 Props 타입
 */
export interface TableListProps {
  id?: string;
  config?: TableListConfig;
  className?: string;
  style?: React.CSSProperties;

  // 데이터 관련
  data?: any[];
  loading?: boolean;
  error?: string;

  // 이벤트 핸들러
  onRowClick?: (row: any) => void;
  onRowDoubleClick?: (row: any) => void;
  onSelectionChange?: (selectedRows: any[]) => void;
  onPageChange?: (page: number, pageSize: number) => void;
  onSortChange?: (column: string, direction: "asc" | "desc") => void;
  onFilterChange?: (filters: any) => void;
  onRefresh?: () => void;

  // 선택된 행 정보 전달 핸들러
  onSelectedRowsChange?: (selectedRows: any[], selectedRowsData: any[]) => void;
}
