/**
 * ModalRepeaterTable 컴포넌트 타입 정의
 * 모달에서 데이터를 검색하여 선택하고, Repeater 테이블에 추가하는 컴포넌트
 */

export interface ModalRepeaterTableProps {
  // 소스 데이터 (모달에서 가져올 데이터)
  sourceTable: string; // 검색할 테이블 (예: "item_info")
  sourceColumns: string[]; // 모달에 표시할 컬럼들
  sourceColumnLabels?: Record<string, string>; // 모달 컬럼 라벨 (컬럼명 -> 표시 라벨)
  sourceSearchFields?: string[]; // 검색 가능한 필드들

  // 저장 대상 테이블 설정
  targetTable?: string; // 저장할 테이블 (예: "sales_order_mng")

  // 모달 설정
  modalTitle: string; // 모달 제목 (예: "품목 검색 및 선택")
  modalButtonText?: string; // 모달 열기 버튼 텍스트 (기본: "품목 검색")
  multiSelect?: boolean; // 다중 선택 허용 (기본: true)
  modalFilters?: ModalFilterConfig[]; // 모달 내 필터 설정

  // Repeater 테이블 설정
  columns: RepeaterColumnConfig[]; // 테이블 컬럼 설정

  // 계산 규칙
  calculationRules?: CalculationRule[]; // 자동 계산 규칙

  // 데이터
  value: Record<string, unknown>[]; // 현재 추가된 항목들
  onChange: (newData: Record<string, unknown>[]) => void; // 데이터 변경 콜백

  // 중복 체크
  uniqueField?: string; // 중복 체크할 필드 (예: "item_code")

  // 필터링
  filterCondition?: Record<string, unknown>;
  companyCode?: string;

  // 스타일
  className?: string;
}

export interface RepeaterColumnConfig {
  field: string; // 필드명
  label: string; // 컬럼 헤더 라벨
  type?: "text" | "number" | "date" | "select" | "category"; // 입력 타입 (🆕 category 추가)
  editable?: boolean; // 편집 가능 여부
  calculated?: boolean; // 계산 필드 여부
  width?: string; // 컬럼 너비
  required?: boolean; // 필수 입력 여부
  hidden?: boolean; // 히든 필드 여부 (UI에서 숨기지만 데이터는 유지)
  defaultValue?: string | number | boolean; // 기본값
  selectOptions?: { value: string; label: string }[]; // select일 때 옵션

  // 🆕 카테고리 타입 설정
  categoryRef?: string; // 카테고리 참조 ID (category 타입일 때 사용)

  // 🆕 자동 입력 설정
  autoFill?: {
    type: "currentDate" | "sequence" | "fromMainForm" | "fixed";
    sourceField?: string; // fromMainForm 타입일 때 메인 폼의 필드명
    fixedValue?: string | number; // fixed 타입일 때 고정값
    format?: string; // 날짜 포맷 등
  };
  
  // 컬럼 매핑 설정
  mapping?: ColumnMapping; // 이 컬럼의 데이터를 어디서 가져올지 설정

  // 동적 데이터 소스 (컬럼 헤더 클릭으로 데이터 소스 전환)
  dynamicDataSource?: DynamicDataSourceConfig;
}

/**
 * 동적 데이터 소스 설정
 * 컬럼 헤더를 클릭하여 데이터 소스를 전환할 수 있는 기능
 * 예: 거래처별 단가, 품목별 단가, 기준 단가 등을 선택
 */
export interface DynamicDataSourceConfig {
  enabled: boolean;
  options: DynamicDataSourceOption[];
  defaultOptionId?: string; // 기본 선택 옵션 ID
}

/**
 * 동적 데이터 소스 옵션
 * 각 옵션은 다른 테이블/API에서 데이터를 가져오는 방법을 정의
 */
export interface DynamicDataSourceOption {
  id: string;
  label: string; // 표시 라벨 (예: "거래처별 단가")
  headerLabel?: string; // 헤더에 표시될 전체 라벨 (예: "단가 - 거래처별 단가")

  // 조회 방식
  sourceType: "table" | "multiTable" | "api";

  // 테이블 직접 조회 (단순 조인 - 1개 테이블)
  tableConfig?: {
    tableName: string; // 참조 테이블명
    valueColumn: string; // 가져올 값 컬럼
    joinConditions: {
      sourceField: string; // 현재 행의 필드
      targetField: string; // 참조 테이블의 필드
    }[];
  };

  // 테이블 복합 조인 (2개 이상 테이블 조인)
  multiTableConfig?: {
    // 조인 체인 정의 (순서대로 조인)
    joinChain: MultiTableJoinStep[];
    // 최종적으로 가져올 값 컬럼 (마지막 테이블에서)
    valueColumn: string;
  };

  // 전용 API 호출 (복잡한 다중 조인)
  apiConfig?: {
    endpoint: string; // API 엔드포인트 (예: "/api/price/customer")
    method?: "GET" | "POST"; // HTTP 메서드 (기본: GET)
    parameterMappings: {
      paramName: string; // API 파라미터명
      sourceField: string; // 현재 행의 필드
    }[];
    responseValueField: string; // 응답에서 값을 가져올 필드
  };
}

/**
 * 복합 조인 단계 정의
 * 예: item_info.item_number → customer_item.item_code → customer_item.id → customer_item_price.customer_item_id
 */
export interface MultiTableJoinStep {
  // 조인할 테이블
  tableName: string;
  // 조인 조건
  joinCondition: {
    // 이전 단계의 필드 (첫 번째 단계는 현재 행의 필드)
    fromField: string;
    // 이 테이블의 필드
    toField: string;
  };
  // 다음 단계로 전달할 필드 (다음 조인에 사용)
  outputField?: string;
  // 추가 필터 조건 (선택사항)
  additionalFilters?: {
    field: string;
    operator: "=" | "!=" | ">" | "<" | ">=" | "<=";
    value: string | number | boolean;
    // 값이 현재 행에서 오는 경우
    valueFromField?: string;
  }[];
}

/**
 * 컬럼 매핑 설정
 * 반복 테이블 컬럼이 어느 테이블의 어느 컬럼에서 값을 가져올지 정의
 */
export interface ColumnMapping {
  /** 매핑 타입 */
  type: "source" | "reference" | "manual";
  
  /** 매핑 타입별 설정 */
  // type: "source" - 소스 테이블 (모달에서 선택한 항목)의 컬럼에서 가져오기
  sourceField?: string; // 소스 테이블의 컬럼명 (예: "item_name")
  
  // type: "reference" - 외부 테이블 참조 (조인)
  referenceTable?: string; // 참조 테이블명 (예: "customer_item_mapping")
  referenceField?: string; // 참조 테이블에서 가져올 컬럼 (예: "basic_price")
  joinCondition?: JoinCondition[]; // 조인 조건
  
  // type: "manual" - 사용자가 직접 입력
}

/**
 * 조인 조건 정의
 */
export interface JoinCondition {
  /** 소스 테이블 (어느 테이블의 컬럼인지) */
  sourceTable?: string; // "source" (item_info) 또는 "target" (sales_order_mng)
  /** 현재 테이블의 컬럼 (소스 테이블 또는 반복 테이블) */
  sourceField: string;
  /** 참조 테이블의 컬럼 */
  targetField: string;
  /** 비교 연산자 */
  operator?: "=" | "!=" | ">" | "<" | ">=" | "<=";
}

export interface CalculationRule {
  result: string; // 결과를 저장할 필드
  formula: string; // 계산 공식 (예: "quantity * unit_price")
  dependencies: string[]; // 의존하는 필드들
}

// 모달 필터 설정 (간소화된 버전)
export interface ModalFilterConfig {
  column: string;         // 필터 대상 컬럼 (소스 테이블의 컬럼명)
  label: string;          // 필터 라벨 (UI에 표시될 이름)
  type: "select" | "text";  // select: 드롭다운 (distinct 값), text: 텍스트 입력
  defaultValue?: string;  // 기본값
}

export interface ItemSelectionModalProps {
  open: boolean;
  onOpenChange: (open: boolean) => void;
  sourceTable: string;
  sourceColumns: string[];
  sourceSearchFields?: string[];
  multiSelect?: boolean;
  filterCondition?: Record<string, unknown>;
  modalTitle: string;
  alreadySelected: Record<string, unknown>[]; // 이미 선택된 항목들 (중복 방지용)
  uniqueField?: string;
  onSelect: (items: Record<string, unknown>[]) => void;
  columnLabels?: Record<string, string>; // 컬럼명 -> 라벨명 매핑
  
  // 모달 내부 필터 (사용자 선택 가능)
  modalFilters?: ModalFilterConfig[];
  
  // 카테고리 타입 컬럼 목록 (해당 컬럼은 코드 → 라벨로 변환하여 표시)
  categoryColumns?: string[];
}
