/**
 * 범용 폼 모달 컴포넌트 타입 정의
 *
 * 섹션 기반 폼 레이아웃, 채번규칙, 다중 행 저장을 지원하는
 * 범용 모달 컴포넌트의 설정 타입입니다.
 */

// Select 옵션 설정
export interface SelectOptionConfig {
  type?: "static" | "table" | "code" | "cascading"; // 옵션 타입 (기본: static)
  // 정적 옵션
  staticOptions?: { value: string; label: string }[];
  // 테이블 기반 옵션
  tableName?: string;
  valueColumn?: string; // 조인할 컬럼 (조회용 기본키)
  labelColumn?: string; // 표시할 컬럼 (화면에 보여줄 텍스트)
  saveColumn?: string; // 저장할 컬럼 (실제로 DB에 저장할 값, 미지정 시 valueColumn 사용)
  filterCondition?: string;
  // 카테고리 컬럼 기반 옵션 (category_values 테이블)
  // 형식: "tableName.columnName" (예: "sales_order_mng.incoterms")
  categoryKey?: string;
  
  // 연쇄 드롭다운 설정 (type이 "cascading"일 때 사용)
  cascading?: {
    parentField?: string; // 부모 필드명 (같은 폼 내)
    relationCode?: string; // 관계 코드 (cascading_relation 테이블)
    // 직접 설정 또는 관계 코드에서 가져온 값 수정 시 사용
    sourceTable?: string; // 옵션을 조회할 테이블
    parentKeyColumn?: string; // 부모 값과 매칭할 컬럼
    // valueColumn, labelColumn은 상위 속성 사용
    emptyParentMessage?: string; // 부모 미선택 시 메시지
    noOptionsMessage?: string; // 옵션 없음 메시지
    clearOnParentChange?: boolean; // 부모 변경 시 값 초기화 (기본: true)
  };
  
  // 직접 입력 허용 (모든 Select 타입에 공통 적용)
  // true: Combobox 형태로 목록 선택 + 직접 입력 가능
  // false/undefined: 기본 Select 형태로 목록에서만 선택 가능
  allowCustomInput?: boolean;
}

// 채번규칙 설정
export interface NumberingRuleConfig {
  enabled?: boolean; // 사용 여부 (기본: false)
  ruleId?: string; // 채번규칙 ID
  editable?: boolean; // 사용자 수정 가능 여부 (기본: false)
  hidden?: boolean; // 숨김 여부 - 자동 저장만 (기본: false)
  generateOnOpen?: boolean; // 모달 열릴 때 생성 (기본: true)
  generateOnSave?: boolean; // 저장 시점에 생성 (기본: false)
}

// 필드 유효성 검사 설정
export interface FieldValidationConfig {
  minLength?: number;
  maxLength?: number;
  min?: number;
  max?: number;
  pattern?: string;
  patternMessage?: string;
  customValidator?: string; // 커스텀 검증 함수명
}

// 필드 설정
export interface FormFieldConfig {
  id: string;
  columnName: string; // DB 컬럼명
  label: string; // 표시 라벨
  fieldType:
    | "text"
    | "number"
    | "date"
    | "datetime"
    | "select"
    | "checkbox"
    | "textarea"
    | "password"
    | "email"
    | "tel";
  required?: boolean;
  defaultValue?: any;
  placeholder?: string;
  disabled?: boolean;
  readOnly?: boolean;
  hidden?: boolean; // 화면에 표시하지 않고 자동 저장만

  // 레이아웃
  width?: string; // 필드 너비 (예: "50%", "100%")
  gridColumn?: number; // 그리드 컬럼 위치 (1-12)
  gridSpan?: number; // 그리드 컬럼 스팬 (1-12)

  // 채번규칙 설정
  numberingRule?: NumberingRuleConfig;

  // Select 옵션
  selectOptions?: SelectOptionConfig;

  // 다중 컬럼 저장 (드롭다운 선택 시 여러 컬럼에 동시 저장)
  linkedFieldGroup?: {
    enabled?: boolean; // 사용 여부
    sourceTable?: string; // 소스 테이블 (예: dept_info)
    displayColumn?: string; // 메인 표시 컬럼 (예: item_name) - 드롭다운에 보여줄 메인 텍스트
    subDisplayColumn?: string; // 서브 표시 컬럼 (예: item_number) - 메인과 함께 표시될 서브 텍스트
    displayFormat?: "name_only" | "code_name" | "name_code" | "custom"; // 표시 형식
    // 커스텀 표시 형식 (displayFormat이 "custom"일 때 사용)
    // 형식: {컬럼명} 으로 치환됨 (예: "{item_name} ({item_number})" → "철판 (ITEM-001)")
    customDisplayFormat?: string;
    mappings?: LinkedFieldMapping[]; // 저장할 컬럼 매핑 (첫 번째 매핑의 sourceColumn이 드롭다운 값으로 사용됨)
  };

  // 유효성 검사
  validation?: FieldValidationConfig;

  // 외부 데이터 수신
  receiveFromParent?: boolean; // 부모에서 값 받기
  parentFieldName?: string; // 부모 필드명 (다르면 지정)

  // 조건부 표시
  visibleCondition?: {
    field: string; // 참조할 필드
    operator: "eq" | "ne" | "gt" | "lt" | "in" | "notIn";
    value: any;
  };

  // 필드 간 연동
  dependsOn?: {
    field: string; // 의존하는 필드
    action: "filter" | "setValue" | "clear";
    config?: any;
  };
  
  // 🆕 연쇄 드롭다운 설정 (부모 필드에 따른 동적 옵션)
  cascading?: {
    enabled: boolean;
    parentField: string; // 부모 필드명
    sourceTable: string; // 옵션을 조회할 테이블
    parentKeyColumn: string; // 부모 값과 매칭할 컬럼
    valueColumn: string; // 드롭다운 value로 사용할 컬럼
    labelColumn: string; // 드롭다운 label로 표시할 컬럼
    additionalFilters?: Record<string, unknown>;
    emptyParentMessage?: string;
    noOptionsMessage?: string;
    loadingMessage?: string;
    clearOnParentChange?: boolean;
  };
}

// 연동 필드 매핑 설정
export interface LinkedFieldMapping {
  sourceColumn: string; // 소스 테이블 컬럼 (예: "dept_code")
  targetTable?: string; // 저장할 테이블 (선택, 없으면 자동 결정)
  targetColumn: string; // 저장할 컬럼 (예: "position_code")
}

// 연동 필드 그룹 설정 (섹션 레벨)
// 하나의 드롭다운에서 선택 시 여러 컬럼에 자동 저장
export interface LinkedFieldGroup {
  id: string;
  label: string; // 드롭다운 라벨 (예: "겸직부서")
  sourceTable: string; // 소스 테이블 (예: "dept_info")
  displayFormat: "name_only" | "code_name" | "name_code"; // 표시 형식
  displayColumn: string; // 표시할 컬럼 (예: "dept_name")
  valueColumn: string; // 값으로 사용할 컬럼 (예: "dept_code")
  mappings: LinkedFieldMapping[]; // 필드 매핑 목록
  required?: boolean; // 필수 여부
  placeholder?: string; // 플레이스홀더
  gridSpan?: number; // 그리드 스팬 (1-12)
}

// 반복 섹션 설정
export interface RepeatSectionConfig {
  minItems?: number; // 최소 항목 수 (기본: 0)
  maxItems?: number; // 최대 항목 수 (기본: 10)
  addButtonText?: string; // 추가 버튼 텍스트 (기본: "+ 추가")
  removeButtonText?: string; // 삭제 버튼 텍스트 (기본: "삭제")
  itemTitle?: string; // 항목 제목 템플릿 (예: "겸직 {index}")
  confirmRemove?: boolean; // 삭제 시 확인 (기본: false)
}

// 옵셔널 필드 그룹 설정 (섹션 내에서 추가 버튼으로 표시되는 필드 그룹)
export interface OptionalFieldGroupConfig {
  id: string; // 그룹 고유 ID
  fields: FormFieldConfig[]; // 그룹에 포함된 필드들

  // 섹션 스타일 설정 (활성화 시 표시되는 영역)
  title: string; // 그룹 제목 (예: "해외 판매 정보")
  description?: string; // 그룹 설명
  columns?: number; // 필드 배치 컬럼 수 (기본: 부모 섹션 columns 상속)
  collapsible?: boolean; // 접을 수 있는지 (기본: false)
  defaultCollapsed?: boolean; // 기본 접힘 상태 (기본: false)

  // 버튼 설정
  addButtonText?: string; // 추가 버튼 텍스트 (기본: "+ {title} 추가")
  removeButtonText?: string; // 제거 버튼 텍스트 (기본: "제거")
  confirmRemove?: boolean; // 제거 시 확인 (기본: false)

  // 연동 필드 설정 (추가/제거 시 다른 필드 값 변경)
  triggerField?: string; // 값을 변경할 필드 (columnName)
  triggerValueOnAdd?: any; // 추가 시 설정할 값 (예: "해외")
  triggerValueOnRemove?: any; // 제거 시 설정할 값 (예: "국내")
}

// 섹션 설정
export interface FormSectionConfig {
  id: string;
  title: string;
  description?: string;
  collapsible?: boolean; // 접을 수 있는지 (기본: false)
  defaultCollapsed?: boolean; // 기본 접힘 상태 (기본: false)
  
  // 섹션 타입: fields (기본) 또는 table (테이블 형식)
  type?: "fields" | "table";
  
  // type: "fields" 일 때 사용
  fields?: FormFieldConfig[];

  // 반복 섹션 (겸직 등)
  repeatable?: boolean;
  repeatConfig?: RepeatSectionConfig;

  // 옵셔널 필드 그룹 (섹션 내에서 추가 버튼으로 표시)
  optionalFieldGroups?: OptionalFieldGroupConfig[];

  // 연동 필드 그룹 (부서코드/부서명 등 연동 저장)
  linkedFieldGroups?: LinkedFieldGroup[];

  // 섹션 레이아웃
  columns?: number; // 필드 배치 컬럼 수 (기본: 2)
  gap?: string; // 필드 간 간격
  
  // type: "table" 일 때 사용
  tableConfig?: TableSectionConfig;
}

// ============================================
// 테이블 섹션 관련 타입 정의
// ============================================

/**
 * 테이블 섹션 설정
 * 모달 내에서 테이블 형식으로 데이터를 표시하고 편집하는 섹션
 */
export interface TableSectionConfig {
  // 1. 소스 설정 (검색 모달에서 데이터를 가져올 테이블)
  source: {
    tableName: string;              // 소스 테이블명 (예: item_info)
    displayColumns: string[];       // 모달에 표시할 컬럼
    searchColumns: string[];        // 검색 가능한 컬럼
    columnLabels?: Record<string, string>; // 컬럼 라벨 (컬럼명 -> 표시 라벨)
  };
  
  // 1-1. 외부 데이터 소스 설정 (데이터 전달 모달열기 액션으로 전달받은 데이터)
  externalDataSource?: {
    enabled: boolean;               // 외부 데이터 소스 사용 여부
    tableName: string;              // 전달받을 데이터의 소스 테이블명 (예: sales_order_detail)
  };
  
  // 2. 필터 설정
  filters?: {
    // 사전 필터 (항상 적용, 사용자에게 노출되지 않음)
    preFilters?: TablePreFilter[];
    
    // 모달 내 필터 UI (사용자가 선택 가능)
    modalFilters?: TableModalFilter[];
  };
  
  // 3. 테이블 컬럼 설정
  columns: TableColumnConfig[];
  
  // 4. 계산 규칙
  calculations?: TableCalculationRule[];
  
  // 5. 저장 설정
  saveConfig?: {
    targetTable?: string;           // 다른 테이블에 저장 시 (미지정 시 메인 테이블)
    uniqueField?: string;           // 중복 체크 필드
  };
  
  // 6. UI 설정
  uiConfig?: {
    modalTitle?: string;            // 모달 제목 (기본: "항목 검색 및 선택")
    multiSelect?: boolean;          // 다중 선택 허용 (기본: true)
    maxHeight?: string;             // 테이블 최대 높이 (기본: "400px")
    
    // 버튼 표시 설정 (동시 표시 가능)
    showSearchButton?: boolean;     // 검색 버튼 표시 (기본: true)
    showAddRowButton?: boolean;     // 행 추가 버튼 표시 (기본: false)
    searchButtonText?: string;      // 검색 버튼 텍스트 (기본: "품목 검색")
    addRowButtonText?: string;      // 행 추가 버튼 텍스트 (기본: "직접 입력")
    
    // 레거시 호환용 (deprecated)
    addButtonType?: "search" | "addRow";
    addButtonText?: string;
  };
  
  // 7. 조건부 테이블 설정 (고급)
  conditionalTable?: ConditionalTableConfig;
}

/**
 * 조건부 테이블 설정
 * 조건(검사유형 등)에 따라 다른 데이터를 표시하고 저장합니다.
 * 
 * 사용 예시:
 * - 품목검사정보: 검사유형(입고/공정/출고/재고/최종)별로 검사항목 관리
 * - BOM 관리: 품목유형별 자재 구성
 * - 공정 관리: 공정유형별 작업 항목
 */
export interface ConditionalTableConfig {
  enabled: boolean;
  
  // 트리거 UI 타입
  // - checkbox: 체크박스로 다중 선택 (선택된 조건들을 탭으로 표시)
  // - dropdown: 드롭다운으로 단일 선택
  // - tabs: 모든 옵션을 탭으로 표시
  triggerType: "checkbox" | "dropdown" | "tabs";
  
  // 조건 값을 저장할 컬럼 (예: inspection_type)
  // 저장 시 각 행에 이 컬럼으로 조건 값이 자동 저장됨
  conditionColumn: string;
  
  // 조건 옵션 목록
  options: ConditionalTableOption[];
  
  // 옵션을 테이블에서 동적으로 로드할 경우
  optionSource?: {
    enabled: boolean;
    tableName: string;              // 예: inspection_type_code
    valueColumn: string;            // 예: type_code
    labelColumn: string;            // 예: type_name
    filterCondition?: string;       // 예: is_active = 'Y'
  };
  
  // 소스 테이블 필터링 설정
  // 조건 선택 시 소스 테이블(검사기준 등)에서 해당 조건으로 필터링
  sourceFilter?: {
    enabled: boolean;
    filterColumn: string;           // 소스 테이블에서 필터링할 컬럼 (예: inspection_type)
  };
}

/**
 * 조건부 테이블 옵션
 */
export interface ConditionalTableOption {
  id: string;
  value: string;                    // 저장될 값 (예: "입고검사")
  label: string;                    // 표시 라벨 (예: "입고검사")
}

/**
 * 사전 필터 조건
 * 검색 시 항상 적용되는 필터 조건
 */
export interface TablePreFilter {
  column: string;                   // 필터할 컬럼
  operator: "=" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "notIn" | "like";
  value: any;                       // 필터 값
}

/**
 * 모달 내 필터 설정
 * 사용자가 선택할 수 있는 필터 UI
 */
export interface TableModalFilter {
  column: string;                   // 필터할 컬럼
  label: string;                    // 필터 라벨
  type: "category" | "text";        // 필터 타입 (category: 드롭다운, text: 텍스트 입력)
  
  // 카테고리 참조 (type: "category"일 때) - 테이블에서 컬럼의 distinct 값 조회
  categoryRef?: {
    tableName: string;              // 테이블명 (예: "item_info")
    columnName: string;             // 컬럼명 (예: "division")
  };
  
  // 정적 옵션 (직접 입력한 경우)
  options?: { value: string; label: string }[];
  
  // 테이블에서 동적 로드 (테이블 컬럼 조회)
  optionsFromTable?: {
    tableName: string;
    valueColumn: string;
    labelColumn: string;
    distinct?: boolean;             // 중복 제거 (기본: true)
  };
  
  // 기본값
  defaultValue?: any;
}

/**
 * 테이블 컬럼 설정
 */
export interface TableColumnConfig {
  field: string;                    // 필드명 (저장할 컬럼명)
  label: string;                    // 컬럼 헤더 라벨
  type: "text" | "number" | "date" | "select" | "category"; // 입력 타입
  
  // 소스 필드 매핑 (검색 모달에서 가져올 컬럼명)
  sourceField?: string;             // 소스 테이블의 컬럼명 (미설정 시 field와 동일)
  
  // 외부 데이터 필드 매핑 (데이터 전달 모달열기로 전달받은 데이터의 컬럼명)
  externalField?: string;           // 외부 데이터의 컬럼명 (미설정 시 field와 동일)
  
  // 편집 설정
  editable?: boolean;               // 편집 가능 여부 (기본: true)
  calculated?: boolean;             // 계산 필드 여부 (자동 읽기전용)
  required?: boolean;               // 필수 입력 여부
  hidden?: boolean;                 // 히든 필드 여부 (UI에서 숨기지만 데이터는 유지)
  
  // 너비 설정
  width?: string;                   // 기본 너비 (예: "150px")
  minWidth?: string;                // 최소 너비
  maxWidth?: string;                // 최대 너비
  
  // 기본값
  defaultValue?: any;
  
  // Select 옵션 (type이 "select"일 때)
  selectOptions?: { value: string; label: string }[];
  
  // 동적 Select 옵션 (소스 테이블에서 옵션 로드)
  // 조건부 테이블의 sourceFilter가 활성화되어 있으면 자동으로 필터 적용
  dynamicSelectOptions?: {
    enabled: boolean;
    sourceField: string;            // 소스 테이블에서 가져올 컬럼 (예: inspection_item)
    labelField?: string;            // 표시 라벨 컬럼 (없으면 sourceField 사용)
    distinct?: boolean;             // 중복 제거 (기본: true)
    
    // 행 선택 모드: 이 컬럼 선택 시 같은 소스 행의 다른 컬럼들도 자동 채움
    // 활성화하면 이 컬럼이 "대표 컬럼"이 되어 선택 시 연관 컬럼들이 자동으로 채워짐
    rowSelectionMode?: {
      enabled: boolean;
      // 자동 채움할 컬럼 매핑 (소스 컬럼 → 타겟 필드)
      // 예: [{ sourceColumn: "inspection_criteria", targetField: "inspection_standard" }]
      autoFillColumns?: {
        sourceColumn: string;       // 소스 테이블의 컬럼
        targetField: string;        // 현재 테이블의 필드
      }[];
      // 소스 테이블의 ID 컬럼 (참조 ID 저장용)
      sourceIdColumn?: string;      // 예: "id"
      targetIdField?: string;       // 예: "inspection_standard_id"
    };
  };
  
  // 값 매핑 (핵심 기능) - 고급 설정용
  valueMapping?: ValueMappingConfig;
  
  // 컬럼 모드 전환 (동적 데이터 소스)
  columnModes?: ColumnModeConfig[];
  
  // 조회 설정 (동적 값 조회)
  lookup?: LookupConfig;

  // 날짜 일괄 적용 (type이 "date"일 때만 사용)
  // 활성화 시 첫 번째 날짜 입력 시 모든 행에 동일한 날짜가 자동 적용됨
  batchApply?: boolean;

  // 부모에서 값 받기 (모든 행에 동일한 값 적용)
  receiveFromParent?: boolean;      // 부모에서 값 받기 활성화
  parentFieldName?: string;         // 부모 필드명 (미지정 시 field와 동일)
  
  // 저장 설정 (컬럼별 저장 여부 및 참조 표시)
  saveConfig?: TableColumnSaveConfig;
}

/**
 * 테이블 컬럼 저장 설정
 * - 컬럼별로 저장 여부를 설정하고, 저장하지 않는 컬럼은 참조 ID로 조회하여 표시
 */
export interface TableColumnSaveConfig {
  // 저장 여부 (기본값: true)
  // true: 사용자가 입력/선택한 값을 DB에 저장
  // false: 저장하지 않고, 참조 ID로 소스 테이블을 조회하여 표시만 함
  saveToTarget: boolean;
  
  // 참조 표시 설정 (saveToTarget이 false일 때 사용)
  referenceDisplay?: {
    // 참조할 ID 컬럼 (같은 테이블 내의 다른 컬럼)
    // 예: "inspection_standard_id"
    referenceIdField: string;
    
    // 소스 테이블에서 가져올 컬럼
    // 예: "inspection_item" → 소스 테이블의 inspection_item 값을 표시
    sourceColumn: string;
  };
}

// ============================================
// 조회(Lookup) 설정 관련 타입 정의
// ============================================

/**
 * 조회 유형
 * - sameTable: 동일 테이블 조회 (소스 테이블에서 다른 컬럼 값)
 * - relatedTable: 연관 테이블 조회 (현재 행 기준으로 다른 테이블에서)
 * - combinedLookup: 복합 조건 조회 (다른 섹션 필드 + 현재 행 조합)
 */
export type LookupType = "sameTable" | "relatedTable" | "combinedLookup";

/**
 * 값 변환 설정
 * 예: 거래처 이름 → 거래처 코드로 변환
 */
export interface LookupTransform {
  enabled: boolean;                            // 변환 사용 여부
  tableName: string;                           // 변환 테이블 (예: customer_mng)
  matchColumn: string;                         // 찾을 컬럼 (예: customer_name)
  resultColumn: string;                        // 가져올 컬럼 (예: customer_code)
}

/**
 * 외부 테이블 조회 설정
 * 다른 테이블에서 조건 값을 조회하여 사용 (이름→코드 변환 등)
 */
export interface ExternalTableLookup {
  tableName: string;       // 조회할 테이블
  matchColumn: string;     // 조회 조건 컬럼 (WHERE 절에서 비교할 컬럼)
  matchSourceType: "currentRow" | "sourceTable" | "sectionField";  // 비교값 출처
  matchSourceField: string;  // 비교값 필드명
  matchSectionId?: string;   // sectionField인 경우 섹션 ID
  resultColumn: string;    // 가져올 컬럼 (SELECT 절)
}

/**
 * 조회 조건 설정
 * 
 * sourceType 설명:
 * - "currentRow": 테이블에 설정된 컬럼 필드값 (rowData에서 가져옴, 예: part_code, quantity)
 * - "sourceTable": 원본 소스 테이블의 컬럼값 (_sourceData에서 가져옴, 예: item_number, company_code)
 * - "sectionField": 폼의 다른 섹션 필드값 (formData에서 가져옴, 예: partner_id)
 * - "externalTable": 외부 테이블에서 조회한 값 (다른 테이블에서 값을 조회해서 조건으로 사용)
 */
export interface LookupCondition {
  sourceType: "currentRow" | "sourceTable" | "sectionField" | "externalTable";  // 값 출처
  sourceField: string;                         // 출처의 필드명 (참조할 필드)
  sectionId?: string;                          // sectionField인 경우 섹션 ID
  targetColumn: string;                        // 조회 테이블의 컬럼

  // 외부 테이블 조회 설정 (sourceType이 "externalTable"인 경우)
  externalLookup?: ExternalTableLookup;

  // 값 변환 설정 (선택) - 이름→코드 등 변환이 필요할 때 (레거시 호환)
  transform?: LookupTransform;
}

/**
 * 조회 옵션 설정
 * 하나의 컬럼에 여러 조회 방식을 정의하고 헤더에서 선택 가능
 */
export interface LookupOption {
  id: string;                                  // 옵션 고유 ID
  label: string;                               // 옵션 라벨 (예: "기준단가", "거래처별 단가")
  displayLabel?: string;                       // 헤더 드롭다운에 표시될 텍스트 (예: "기준단가" → "단가 (기준단가)")
  type: LookupType;                            // 조회 유형
  
  // 조회 테이블 설정
  tableName: string;                           // 조회할 테이블
  valueColumn: string;                         // 가져올 컬럼
  
  // 조회 조건 (여러 조건 AND로 결합)
  conditions: LookupCondition[];
  
  // 기본 옵션 여부
  isDefault?: boolean;
}

/**
 * 컬럼 조회 설정
 */
export interface LookupConfig {
  enabled: boolean;                            // 조회 사용 여부
  options: LookupOption[];                     // 조회 옵션 목록
  defaultOptionId?: string;                    // 기본 선택 옵션 ID
}

/**
 * 값 매핑 설정
 * 컬럼 값을 어디서 가져올지 정의
 */
export interface ValueMappingConfig {
  type: "source" | "manual" | "external" | "internal";
  
  // type: "source" - 소스 테이블에서 복사
  sourceField?: string;             // 소스 테이블의 컬럼명
  
  // type: "external" - 외부 테이블 조회
  externalRef?: {
    tableName: string;              // 조회할 테이블
    valueColumn: string;            // 가져올 컬럼
    joinConditions: TableJoinCondition[];
  };
  
  // type: "internal" - formData의 다른 필드 값 직접 사용
  internalField?: string;           // formData의 필드명
}

/**
 * 테이블 조인 조건
 * 외부 테이블 조회 시 사용하는 조인 조건
 * 
 * sourceType 설명:
 * - "row": 현재 행의 설정된 컬럼 (rowData)
 * - "sourceData": 원본 소스 테이블 데이터 (_sourceData)
 * - "formData": 폼의 다른 섹션 필드 (formData)
 * - "externalTable": 외부 테이블에서 조회한 값
 */
export interface TableJoinCondition {
  sourceType: "row" | "sourceData" | "formData" | "externalTable";   // 값 출처
  sourceField: string;              // 출처의 필드명
  targetColumn: string;             // 조회 테이블의 컬럼
  operator?: "=" | "!=" | ">" | "<" | ">=" | "<="; // 연산자 (기본: "=")

  // 외부 테이블 조회 설정 (sourceType이 "externalTable"인 경우)
  externalLookup?: ExternalTableLookup;

  // 값 변환 설정 (선택) - 이름→코드 등 중간 변환이 필요할 때 (레거시 호환)
  transform?: {
    tableName: string;              // 변환 테이블 (예: customer_mng)
    matchColumn: string;            // 찾을 컬럼 (예: customer_name)
    resultColumn: string;           // 가져올 컬럼 (예: customer_code)
  };
}

/**
 * 컬럼 모드 설정
 * 하나의 컬럼에서 여러 데이터 소스를 전환하여 사용
 */
export interface ColumnModeConfig {
  id: string;                       // 모드 고유 ID
  label: string;                    // 모드 라벨 (예: "기준 단가", "거래처별 단가")
  isDefault?: boolean;              // 기본 모드 여부
  valueMapping: ValueMappingConfig; // 이 모드의 값 매핑
}

/**
 * 조건부 계산 규칙
 * 특정 필드 값에 따라 다른 계산식 적용
 */
export interface ConditionalCalculationRule {
  conditionValue: string;           // 조건 값 (예: "국내", "해외")
  formula: string;                  // 해당 조건일 때 사용할 계산식
}

/**
 * 조건부 계산 설정
 */
export interface ConditionalCalculationConfig {
  enabled: boolean;                 // 조건부 계산 활성화 여부
  conditionField: string;           // 조건 기준 필드 (예: "sales_type")
  conditionFieldType?: "static" | "code" | "table"; // 조건 필드의 옵션 타입
  conditionFieldCategoryKey?: string; // 카테고리 키 (예: "sales_order_mng.sales_type")
  rules: ConditionalCalculationRule[]; // 조건별 계산 규칙
  defaultFormula?: string;          // 조건에 해당하지 않을 때 기본 계산식
}

/**
 * 테이블 계산 규칙
 * 다른 컬럼 값을 기반으로 자동 계산
 */
export interface TableCalculationRule {
  resultField: string;              // 결과를 저장할 필드
  formula: string;                  // 계산 공식 (예: "quantity * unit_price")
  dependencies: string[];           // 의존하는 필드들
  
  // 조건부 계산 (선택사항)
  conditionalCalculation?: ConditionalCalculationConfig;
}

/**
 * 섹션별 저장 방식 설정
 * 공통 저장: 해당 섹션의 필드 값이 모든 품목 행에 동일하게 저장됩니다 (예: 수주번호, 거래처)
 * 개별 저장: 해당 섹션의 필드 값이 각 품목마다 다르게 저장됩니다 (예: 품목코드, 수량, 단가)
 */
export interface SectionSaveMode {
  sectionId: string;
  saveMode: "common" | "individual"; // 공통 저장 / 개별 저장
  // 필드별 세부 설정 (선택사항 - 섹션 기본값과 다르게 설정할 필드)
  fieldOverrides?: {
    fieldName: string;
    saveMode: "common" | "individual";
  }[];
}

// 저장 설정
export interface SaveConfig {
  tableName: string;
  primaryKeyColumn?: string; // PK 컬럼 (수정 시 사용)

  // 커스텀 API 저장 설정 (테이블 직접 저장 대신 전용 API 사용)
  customApiSave?: CustomApiSaveConfig;

  // 섹션별 저장 방식 설정
  sectionSaveModes?: SectionSaveMode[];

  // 저장 후 동작 (간편 설정)
  showToast?: boolean; // 토스트 메시지 (기본: true)
  refreshParent?: boolean; // 부모 새로고침 (기본: true)

  // 저장 후 동작 (상세 설정)
  afterSave?: {
    closeModal?: boolean; // 모달 닫기 (기본: true)
    refreshParent?: boolean; // 부모 새로고침 (기본: true)
    showToast?: boolean; // 토스트 메시지 (기본: true)
    customAction?: string; // 커스텀 액션 이벤트명
  };
}

/**
 * 서브 테이블 필드 매핑
 * 폼 필드(columnName)를 서브 테이블의 컬럼에 매핑합니다.
 */
export interface SubTableFieldMapping {
  formField: string;      // 폼 필드의 columnName
  targetColumn: string;   // 서브 테이블의 컬럼명
}

/**
 * 서브 테이블 저장 설정
 * 반복 섹션의 데이터를 별도 테이블에 저장하는 설정입니다.
 */
export interface SubTableSaveConfig {
  enabled: boolean;
  tableName: string;              // 서브 테이블명 (예: user_dept, order_items)
  repeatSectionId: string;        // 연결할 반복 섹션 ID
  
  // 연결 설정 (메인 테이블과 서브 테이블 연결)
  linkColumn: {
    mainField: string;            // 메인 테이블의 연결 필드 (예: user_id)
    subColumn: string;            // 서브 테이블의 연결 컬럼 (예: user_id)
  };
  
  // 필드 매핑 (반복 섹션 필드 → 서브 테이블 컬럼)
  fieldMappings: SubTableFieldMapping[];
  
  // 추가 옵션
  options?: {
    // 메인 데이터도 서브 테이블에 저장 (1:N에서 메인도 저장할 때)
    saveMainAsFirst?: boolean;
    mainFieldMappings?: SubTableFieldMapping[];  // 메인 데이터용 필드 매핑
    mainMarkerColumn?: string;    // 메인 여부 표시 컬럼 (예: is_primary)
    mainMarkerValue?: any;        // 메인일 때 값 (예: true)
    subMarkerValue?: any;         // 서브일 때 값 (예: false)
    
    // 저장 전 기존 데이터 삭제
    deleteExistingBefore?: boolean;
    deleteOnlySubItems?: boolean; // 메인 항목은 유지하고 서브만 삭제
    
    // 수정 모드에서 서브 테이블 데이터 로드
    loadOnEdit?: boolean;         // 수정 시 서브 테이블 데이터 로드 여부
    loadOnlySubItems?: boolean;   // 서브 항목만 로드 (메인 항목 제외)
  };
}

/**
 * 다중 테이블 저장 설정 (범용)
 * 
 * 메인 테이블 + 서브 테이블(들)에 트랜잭션으로 저장합니다.
 * 
 * ## 사용 예시
 * 
 * ### 사원 + 부서 (user_info + user_dept)
 * - 메인 테이블: user_info (사원 정보)
 * - 서브 테이블: user_dept (부서 관계, 메인 부서 + 겸직 부서)
 * 
 * ### 주문 + 주문상세 (orders + order_items)
 * - 메인 테이블: orders (주문 정보)
 * - 서브 테이블: order_items (주문 상품 목록)
 */
export interface MultiTableSaveConfig {
  enabled: boolean;
  
  // 메인 테이블 설정
  mainTable: {
    tableName: string;            // 메인 테이블명
    primaryKeyColumn: string;     // PK 컬럼명
  };
  
  // 서브 테이블 설정 (여러 개 가능)
  subTables: SubTableSaveConfig[];
}

/**
 * 커스텀 API 저장 설정
 * 
 * 테이블 직접 저장 대신 전용 백엔드 API를 호출합니다.
 * 복잡한 비즈니스 로직(다중 테이블 저장, 트랜잭션 등)에 사용합니다.
 */
export interface CustomApiSaveConfig {
  enabled: boolean;
  apiType: "multi-table" | "custom"; // API 타입
  
  // 다중 테이블 저장 설정 (범용)
  multiTable?: MultiTableSaveConfig;
  
  // 커스텀 API 전용 설정
  customEndpoint?: string; // 커스텀 API 엔드포인트
  customMethod?: "POST" | "PUT"; // HTTP 메서드
}

// 모달 설정
export interface ModalConfig {
  title: string;
  description?: string;
  size: "sm" | "md" | "lg" | "xl" | "full";
  closeOnOutsideClick?: boolean;
  showCloseButton?: boolean;
}

// 전체 설정
export interface UniversalFormModalConfig {
  modal: ModalConfig;
  sections: FormSectionConfig[];
  saveConfig: SaveConfig;

  // 수정 모드 설정
  editMode?: {
    enabled: boolean;
    loadDataOnOpen?: boolean; // 모달 열릴 때 데이터 로드
    identifierField?: string; // 식별자 필드 (user_id 등)
  };
}

// 반복 섹션 데이터 아이템
export interface RepeatSectionItem {
  _id: string; // 내부 고유 ID
  _index: number; // 인덱스
  [key: string]: any; // 필드 데이터
}

// 폼 데이터 상태
export interface FormDataState {
  // 일반 필드 데이터
  [key: string]: any;
  // 반복 섹션 데이터
  _repeatSections?: {
    [sectionId: string]: RepeatSectionItem[];
  };
}

// 컴포넌트 Props
export interface UniversalFormModalComponentProps {
  component?: any;
  config?: UniversalFormModalConfig;
  isDesignMode?: boolean;
  isSelected?: boolean;
  className?: string;
  style?: React.CSSProperties;

  // 외부에서 전달받는 초기 데이터
  initialData?: Record<string, any>;

  // 이벤트 핸들러
  onSave?: (data: any) => void;
  onCancel?: () => void;
  onChange?: (data: FormDataState) => void;
}

// ConfigPanel Props
export interface UniversalFormModalConfigPanelProps {
  config: UniversalFormModalConfig;
  onChange: (config: UniversalFormModalConfig) => void;
  // 화면 설계 시 같은 화면의 다른 컴포넌트들 (부모 데이터 필드 추출용)
  allComponents?: any[];
}

// 필드 타입 옵션
export const FIELD_TYPE_OPTIONS = [
  { value: "text", label: "텍스트" },
  { value: "number", label: "숫자" },
  { value: "date", label: "날짜" },
  { value: "datetime", label: "날짜시간" },
  { value: "select", label: "선택(드롭다운)" },
  { value: "checkbox", label: "체크박스" },
  { value: "textarea", label: "여러 줄 텍스트" },
  { value: "password", label: "비밀번호" },
  { value: "email", label: "이메일" },
  { value: "tel", label: "전화번호" },
] as const;

// 모달 크기 옵션
export const MODAL_SIZE_OPTIONS = [
  { value: "sm", label: "작게 (400px)" },
  { value: "md", label: "보통 (600px)" },
  { value: "lg", label: "크게 (800px)" },
  { value: "xl", label: "매우 크게 (1000px)" },
  { value: "full", label: "전체 화면" },
] as const;

// Select 옵션 타입
export const SELECT_OPTION_TYPE_OPTIONS = [
  { value: "static", label: "직접 입력" },
  { value: "table", label: "테이블 참조" },
  { value: "code", label: "공통코드" },
  { value: "cascading", label: "연쇄 드롭다운" },
] as const;

// 연동 필드 표시 형식 옵션
export const LINKED_FIELD_DISPLAY_FORMAT_OPTIONS = [
  { value: "name_only", label: "이름만 (예: 영업부)" },
  { value: "code_name", label: "코드 - 이름 (예: SALES - 영업부)" },
  { value: "name_code", label: "이름 (코드) (예: 영업부 (SALES))" },
  { value: "custom", label: "커스텀 형식 (직접 입력)" },
] as const;

// ============================================
// 테이블 섹션 관련 상수
// ============================================

// 섹션 타입 옵션
export const SECTION_TYPE_OPTIONS = [
  { value: "fields", label: "필드 타입" },
  { value: "table", label: "테이블 타입" },
] as const;

// 테이블 컬럼 타입 옵션
export const TABLE_COLUMN_TYPE_OPTIONS = [
  { value: "text", label: "텍스트" },
  { value: "number", label: "숫자" },
  { value: "date", label: "날짜" },
  { value: "select", label: "선택(드롭다운)" },
  { value: "category", label: "카테고리" },
] as const;

// 값 매핑 타입 옵션
export const VALUE_MAPPING_TYPE_OPTIONS = [
  { value: "source", label: "소스 테이블에서 복사" },
  { value: "manual", label: "사용자 직접 입력" },
  { value: "external", label: "외부 테이블 조회" },
  { value: "internal", label: "폼 데이터 참조" },
] as const;

// 조인 조건 소스 타입 옵션
export const JOIN_SOURCE_TYPE_OPTIONS = [
  { value: "row", label: "현재 행 데이터" },
  { value: "formData", label: "폼 필드 값" },
] as const;

// 필터 연산자 옵션
export const FILTER_OPERATOR_OPTIONS = [
  { value: "=", label: "같음 (=)" },
  { value: "!=", label: "다름 (!=)" },
  { value: ">", label: "큼 (>)" },
  { value: "<", label: "작음 (<)" },
  { value: ">=", label: "크거나 같음 (>=)" },
  { value: "<=", label: "작거나 같음 (<=)" },
  { value: "in", label: "포함 (IN)" },
  { value: "notIn", label: "미포함 (NOT IN)" },
  { value: "like", label: "유사 (LIKE)" },
] as const;

// 모달 필터 타입 옵션
export const MODAL_FILTER_TYPE_OPTIONS = [
  { value: "category", label: "테이블 조회" },
  { value: "text", label: "텍스트 입력" },
] as const;

// 조회 유형 옵션
export const LOOKUP_TYPE_OPTIONS = [
  { value: "sameTable", label: "동일 테이블 조회" },
  { value: "relatedTable", label: "연관 테이블 조회" },
  { value: "combinedLookup", label: "복합 조건 조회" },
] as const;

// 조회 조건 소스 타입 옵션
export const LOOKUP_CONDITION_SOURCE_OPTIONS = [
  { value: "currentRow", label: "현재 행" },
  { value: "sourceTable", label: "소스 테이블" },
  { value: "sectionField", label: "다른 섹션" },
  { value: "externalTable", label: "외부 테이블" },
] as const;

// 조건부 테이블 트리거 타입 옵션
export const CONDITIONAL_TABLE_TRIGGER_OPTIONS = [
  { value: "checkbox", label: "체크박스 (다중 선택)" },
  { value: "dropdown", label: "드롭다운 (단일 선택)" },
  { value: "tabs", label: "탭 (전체 표시)" },
] as const;
