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

/**
 * RepeatScreenModal Props
 * 선택한 행 개수만큼 카드를 생성하며, 각 카드는 커스터마이징 가능한 레이아웃을 가짐
 * 
 * 🆕 v3: 행(Row) 기반 자유 레이아웃 - 각 행마다 타입(헤더/집계/테이블) 선택 가능
 */
export interface RepeatScreenModalProps {
  // === 기본 설정 ===
  showCardTitle?: boolean; // 카드 제목 표시 여부
  cardTitle?: string; // 카드 제목 템플릿 (예: "{order_no} - {item_code}")
  cardSpacing?: string; // 카드 간 간격 (기본: 24px)
  showCardBorder?: boolean; // 카드 테두리 표시 여부
  saveMode?: "all" | "individual"; // 저장 모드

  // === 데이터 소스 ===
  dataSource?: DataSourceConfig; // 데이터 소스 설정

  // === 그룹핑 설정 ===
  grouping?: GroupingConfig; // 그룹핑 설정

  // === 🆕 v3: 자유 레이아웃 ===
  contentRows?: CardContentRowConfig[]; // 카드 내부 행들 (각 행마다 타입 선택)

  // === 🆕 v3.1: Footer 버튼 설정 ===
  footerConfig?: FooterConfig; // Footer 영역 설정

  // === (레거시 호환) ===
  cardMode?: "simple" | "withTable"; // @deprecated - contentRows 사용 권장
  cardLayout?: CardRowConfig[]; // @deprecated - contentRows 사용 권장
  tableLayout?: TableLayoutConfig; // @deprecated - contentRows 사용 권장

  // === 값 ===
  value?: any[];
  onChange?: (newData: any[]) => void;
}

/**
 * 🆕 v3.1: Footer 설정
 */
export interface FooterConfig {
  enabled: boolean; // Footer 사용 여부
  buttons?: FooterButtonConfig[]; // Footer 버튼들
  position?: "sticky" | "static"; // sticky: 하단 고정, static: 컨텐츠 아래
  alignment?: "left" | "center" | "right"; // 버튼 정렬
}

/**
 * 🆕 v3.1: Footer 버튼 설정
 */
export interface FooterButtonConfig {
  id: string; // 버튼 고유 ID
  label: string; // 버튼 라벨
  action: "save" | "cancel" | "close" | "reset" | "custom"; // 액션 타입
  variant?: "default" | "secondary" | "outline" | "destructive" | "ghost"; // 버튼 스타일
  icon?: string; // 아이콘 (lucide 아이콘명)
  disabled?: boolean; // 비활성화 여부
  
  // custom 액션일 때
  customAction?: {
    type: string; // 커스텀 액션 타입
    config?: Record<string, any>; // 커스텀 설정
  };
}

/**
 * 데이터 소스 설정
 */
export interface DataSourceConfig {
  sourceTable: string; // 조회할 테이블 (예: "sales_order_mng")
  filterField?: string; // formData에서 필터링할 필드 (예: "selectedIds")
  selectColumns?: string[]; // 선택할 컬럼 목록
}

/**
 * 그룹핑 설정
 * 특정 필드 기준으로 여러 행을 하나의 카드로 묶음
 */
export interface GroupingConfig {
  enabled: boolean; // 그룹핑 활성화 여부
  groupByField: string; // 그룹 기준 필드 (예: "part_code")
  
  // 집계 설정 (그룹별 합계, 개수 등)
  aggregations?: AggregationConfig[];
}

/**
 * 🆕 v3: 카드 내부 행 설정
 * 각 행마다 타입(헤더/집계/테이블)을 선택할 수 있음
 */
export interface CardContentRowConfig {
  id: string; // 행 고유 ID
  type: "header" | "aggregation" | "table" | "fields"; // 행 타입
  
  // === header/fields 타입일 때 ===
  columns?: CardColumnConfig[]; // 컬럼 설정
  layout?: "horizontal" | "vertical"; // 레이아웃 방향
  gap?: string; // 컬럼 간 간격
  backgroundColor?: string; // 배경색
  padding?: string; // 패딩
  
  // === aggregation 타입일 때 ===
  aggregationFields?: AggregationDisplayConfig[]; // 표시할 집계 필드들
  aggregationLayout?: "horizontal" | "grid"; // 집계 레이아웃 (가로 나열 / 그리드)
  aggregationColumns?: number; // grid일 때 컬럼 수 (기본: 4)
  
  // === table 타입일 때 ===
  tableColumns?: TableColumnConfig[]; // 테이블 컬럼 설정
  tableTitle?: string; // 테이블 제목
  showTableHeader?: boolean; // 테이블 헤더 표시 여부
  tableMaxHeight?: string; // 테이블 최대 높이
  
  // 🆕 v3.1: 테이블 외부 데이터 소스
  tableDataSource?: TableDataSourceConfig; // 외부 테이블에서 데이터 조회
  
  // 🆕 v3.1: 테이블 CRUD 설정
  tableCrud?: TableCrudConfig; // 행 추가/수정/삭제 설정
}

/**
 * 🆕 v3.1: 테이블 데이터 소스 설정
 * 외부 테이블에서 연관 데이터를 조회
 */
export interface TableDataSourceConfig {
  enabled: boolean; // 외부 데이터 소스 사용 여부
  sourceTable: string; // 조회할 테이블 (예: "shipment_plan")
  
  // 조인 설정
  joinConditions: JoinCondition[]; // 조인 조건 (복합 키 지원)
  
  // 🆕 v3.3: 추가 조인 테이블 설정 (소스 테이블에 없는 컬럼 조회)
  additionalJoins?: AdditionalJoinConfig[];
  
  // 🆕 v3.4: 필터 조건 설정 (그룹 내 특정 조건으로 필터링)
  filterConfig?: TableFilterConfig;
  
  // 정렬 설정
  orderBy?: {
    column: string; // 정렬 컬럼
    direction: "asc" | "desc"; // 정렬 방향
  };
  
  // 제한
  limit?: number; // 최대 행 수
}

/**
 * 🆕 v3.4: 테이블 필터 설정
 * 그룹 내 데이터를 특정 조건으로 필터링
 */
export interface TableFilterConfig {
  enabled: boolean; // 필터 사용 여부
  filterField: string; // 필터링할 필드 (예: "order_no")
  filterType: "equals" | "notEquals"; // equals: 같은 값만, notEquals: 다른 값만
  referenceField: string; // 비교 기준 필드 (formData 또는 카드 대표 데이터에서)
  referenceSource: "formData" | "representativeData"; // 비교 값 소스
}

/**
 * 🆕 v3.3: 추가 조인 테이블 설정
 * 소스 테이블에서 다른 테이블을 조인하여 컬럼 가져오기
 */
export interface AdditionalJoinConfig {
  id: string; // 조인 설정 고유 ID
  joinTable: string; // 조인할 테이블 (예: "sales_order_mng")
  joinType: "left" | "inner"; // 조인 타입
  sourceKey: string; // 소스 테이블의 조인 키 (예: "sales_order_id")
  targetKey: string; // 조인 테이블의 키 (예: "id")
  alias?: string; // 테이블 별칭 (예: "so")
  selectColumns?: string[]; // 가져올 컬럼 목록 (비어있으면 전체)
}

/**
 * 🆕 v3.1: 조인 조건
 */
export interface JoinCondition {
  sourceKey: string; // 외부 테이블의 조인 키 (예: "sales_order_id")
  referenceKey: string; // 현재 카드 데이터의 참조 키 (예: "id")
  referenceType?: "card" | "row"; // card: 카드 대표 데이터, row: 각 행 데이터 (기본: card)
}

/**
 * 🆕 v3.1: 테이블 CRUD 설정
 */
export interface TableCrudConfig {
  allowCreate: boolean; // 행 추가 허용
  allowUpdate: boolean; // 행 수정 허용
  allowDelete: boolean; // 행 삭제 허용
  
  // 신규 행 기본값
  newRowDefaults?: Record<string, string>; // 기본값 (예: { status: "READY", sales_order_id: "{id}" })
  
  // 삭제 확인
  deleteConfirm?: {
    enabled: boolean; // 삭제 확인 팝업 표시 여부
    message?: string; // 확인 메시지
  };
  
  // 저장 대상 테이블 (외부 데이터 소스 사용 시)
  targetTable?: string; // 저장할 테이블 (기본: tableDataSource.sourceTable)
  
  // 🆕 v3.12: 연동 저장 설정 (모달 전체 저장 시 다른 테이블에도 동기화)
  syncSaves?: SyncSaveConfig[];
  
  // 🆕 v3.13: 행 추가 시 자동 채번 설정
  rowNumbering?: RowNumberingConfig;
}

/**
 * 🆕 v3.13: 테이블 행 채번 설정
 * "추가" 버튼 클릭 시 특정 컬럼에 자동으로 번호를 생성
 * 
 * 사용 예시:
 * - 출하계획번호(shipment_plan_no) 자동 생성
 * - 송장번호(invoice_no) 자동 생성
 * - 작업지시번호(work_order_no) 자동 생성
 * 
 * 참고: 채번 후 읽기 전용 여부는 테이블 컬럼의 "수정 가능" 설정으로 제어
 */
export interface RowNumberingConfig {
  enabled: boolean; // 채번 사용 여부
  targetColumn: string; // 채번 결과를 저장할 컬럼 (예: "shipment_plan_no")
  
  // 채번 규칙 설정 (옵션설정 > 코드설정에서 등록된 채번 규칙)
  numberingRuleId: string; // 채번 규칙 ID (numbering_rule 테이블)
}

/**
 * 🆕 v3.12: 연동 저장 설정
 * 테이블 데이터 저장 시 다른 테이블의 특정 컬럼에 집계 값을 동기화
 */
export interface SyncSaveConfig {
  id: string; // 고유 ID
  enabled: boolean; // 활성화 여부
  
  // 소스 설정 (이 테이블에서)
  sourceColumn: string; // 집계할 컬럼 (예: "plan_qty")
  aggregationType: "sum" | "count" | "avg" | "min" | "max" | "latest"; // 집계 방식
  
  // 대상 설정 (저장할 테이블)
  targetTable: string; // 대상 테이블 (예: "sales_order_mng")
  targetColumn: string; // 대상 컬럼 (예: "plan_ship_qty")
  
  // 조인 키 (어떤 레코드를 업데이트할지)
  joinKey: {
    sourceField: string; // 이 테이블의 조인 키 (예: "sales_order_id")
    targetField: string; // 대상 테이블의 키 (예: "id")
  };
}

/**
 * 🆕 v3: 집계 표시 설정
 */
export interface AggregationDisplayConfig {
  // 값 소스 타입
  sourceType: "aggregation" | "formula" | "external" | "externalFormula";
  
  // === sourceType: "aggregation" (기존 그룹핑 집계 결과 참조) ===
  aggregationResultField?: string; // 그룹핑 설정의 resultField 참조
  
  // === sourceType: "formula" (컬럼 간 연산) ===
  formula?: string; // 연산식 (예: "{order_qty} - {ship_qty}")
  
  // === sourceType: "external" (외부 테이블 조회) ===
  externalSource?: ExternalValueSource;
  
  // === sourceType: "externalFormula" (외부 테이블 + 연산) ===
  externalSources?: ExternalValueSource[]; // 여러 외부 소스
  externalFormula?: string; // 외부 값들을 조합한 연산식 (예: "{inv_qty} + {prod_qty}")
  
  // 표시 설정
  label: string; // 표시 라벨
  icon?: string; // 아이콘 (lucide 아이콘명)
  backgroundColor?: string; // 배경색
  textColor?: string; // 텍스트 색상
  fontSize?: "xs" | "sm" | "base" | "lg" | "xl" | "2xl"; // 폰트 크기
  format?: "number" | "currency" | "percent"; // 숫자 포맷
  decimalPlaces?: number; // 소수점 자릿수
}

/**
 * 🆕 v3.1: 외부 값 소스 설정
 */
export interface ExternalValueSource {
  alias: string; // 연산식에서 사용할 별칭 (예: "inv_qty")
  sourceTable: string; // 조회할 테이블
  sourceColumn: string; // 조회할 컬럼
  aggregationType?: "sum" | "count" | "avg" | "min" | "max" | "first"; // 집계 타입 (기본: first)
  
  // 조인 설정 (다단계 조인 지원)
  joins: ChainedJoinConfig[];
}

/**
 * 🆕 v3.1: 다단계 조인 설정
 */
export interface ChainedJoinConfig {
  step: number; // 조인 순서 (1, 2, 3...)
  sourceTable: string; // 조인할 테이블
  joinConditions: {
    sourceKey: string; // 조인 테이블의 키
    referenceKey: string; // 참조 키 (이전 단계 결과 또는 카드 데이터)
    referenceFrom?: "card" | "previousStep"; // 참조 소스 (기본: card, step > 1이면 previousStep)
  }[];
  selectColumns?: string[]; // 이 단계에서 선택할 컬럼
}

/**
 * 집계 설정
 * 🆕 v3.2: 다중 테이블 및 가상 집계(formula) 지원
 * 🆕 v3.9: 연관 테이블 저장 기능 추가
 */
export interface AggregationConfig {
  // === 집계 소스 타입 ===
  sourceType: "column" | "formula"; // column: 테이블 컬럼 집계, formula: 연산식 (가상 집계)
  
  // === sourceType: "column" (테이블 컬럼 집계) ===
  sourceTable?: string; // 집계할 테이블 (기본: dataSource.sourceTable, 외부 테이블도 가능)
  sourceField?: string; // 원본 필드 (예: "balance_qty")
  type?: "sum" | "count" | "avg" | "min" | "max"; // 집계 타입
  
  // === sourceType: "formula" (가상 집계 - 연산식) ===
  // 연산식 문법:
  // - {resultField}: 다른 집계 결과 참조 (예: {total_balance})
  // - {테이블.컬럼}: 테이블의 컬럼 직접 참조 (예: {sales_order_mng.order_qty})
  // - SUM({컬럼}): 기본 테이블 행들의 합계
  // - SUM_EXT({컬럼}): 외부 테이블 행들의 합계 (externalTableData)
  // - 산술 연산: +, -, *, /, ()
  formula?: string; // 연산식 (예: "{total_balance} - SUM_EXT({plan_qty})")
  
  // === 🆕 v3.11: SUM_EXT 참조 테이블 제한 ===
  // SUM_EXT 함수가 참조할 외부 테이블 행 ID 목록
  // 비어있거나 undefined면 모든 외부 테이블 데이터 사용 (기존 동작)
  // 특정 테이블만 참조하려면 contentRow의 id를 배열로 지정
  externalTableRefs?: string[]; // 참조할 테이블 행 ID 목록 (예: ["crow-1764571929625"])
  
  // === 공통 ===
  resultField: string; // 결과 필드명 (예: "total_balance_qty")
  label: string; // 표시 라벨 (예: "총수주잔량")
  
  // === 🆕 v3.10: 숨김 설정 ===
  hidden?: boolean; // 레이아웃에서 숨김 (연산에만 사용, 기본: false)
  
  // === 🆕 v3.9: 저장 설정 ===
  saveConfig?: AggregationSaveConfig; // 연관 테이블 저장 설정
}

/**
 * 🆕 v3.9: 집계 결과 저장 설정
 * 집계된 값을 다른 테이블에 동기화
 */
export interface AggregationSaveConfig {
  enabled: boolean; // 저장 활성화 여부
  autoSave: boolean; // 자동 저장 (레이아웃에 없어도 저장)
  
  // 저장 대상
  targetTable: string; // 저장할 테이블 (예: "sales_order_mng")
  targetColumn: string; // 저장할 컬럼 (예: "plan_qty_total")
  
  // 조인 키 (어떤 레코드를 업데이트할지)
  joinKey: {
    sourceField: string; // 현재 카드의 조인 키 (예: "id" 또는 "sales_order_id")
    targetField: string; // 대상 테이블의 키 (예: "id")
  };
}

/**
 * @deprecated v3에서는 contentRows 사용 권장
 * 테이블 포함 레이아웃 설정
 */
export interface TableLayoutConfig {
  headerRows: CardRowConfig[];
  tableColumns: TableColumnConfig[];
  tableTitle?: string;
  showTableHeader?: boolean;
  tableMaxHeight?: string;
}

/**
 * 테이블 컬럼 설정
 */
export interface TableColumnConfig {
  id: string; // 컬럼 고유 ID
  field: string; // 필드명 (소스 테이블 컬럼 또는 조인 테이블 컬럼)
  label: string; // 헤더 라벨
  type: "text" | "number" | "date" | "select" | "badge"; // 타입
  width?: string; // 너비 (예: "100px", "20%")
  align?: "left" | "center" | "right"; // 정렬
  editable: boolean; // 편집 가능 여부
  required?: boolean; // 필수 입력 여부
  
  // 🆕 v3.13: 숨김 설정 (화면에는 안 보이지만 데이터는 존재)
  hidden?: boolean; // 숨김 여부
  
  // 🆕 v3.3: 컬럼 소스 테이블 지정 (조인 테이블 컬럼 사용 시)
  fromTable?: string; // 컬럼이 속한 테이블 (비어있으면 소스 테이블)
  fromJoinId?: string; // additionalJoins의 id 참조 (조인 테이블 컬럼일 때)
  
  // Select 타입 옵션
  selectOptions?: { value: string; label: string }[];
  
  // Badge 타입 설정
  badgeVariant?: "default" | "secondary" | "destructive" | "outline";
  badgeColorMap?: Record<string, string>; // 값별 색상 매핑
  
  // 데이터 소스 설정
  sourceConfig?: ColumnSourceConfig;
  
  // 데이터 타겟 설정
  targetConfig?: ColumnTargetConfig;
}

/**
 * 카드 행 설정
 * 카드는 여러 행(Row)으로 구성되며, 각 행은 여러 컬럼을 가짐
 */
export interface CardRowConfig {
  id: string; // 행 고유 ID
  columns: CardColumnConfig[]; // 이 행에 배치할 컬럼들
  gap?: string; // 컬럼 간 간격 (기본: 16px)
  layout?: "horizontal" | "vertical"; // 레이아웃 방향 (기본: horizontal)
  
  // 🆕 행 스타일 설정
  backgroundColor?: string; // 배경색 (예: "blue", "green")
  padding?: string; // 패딩
  rounded?: boolean; // 둥근 모서리
}

/**
 * 카드 컬럼 설정
 */
export interface CardColumnConfig {
  id: string; // 컬럼 고유 ID
  field: string; // 필드명 (데이터 바인딩)
  label: string; // 라벨
  type: "text" | "number" | "date" | "select" | "textarea" | "component" | "aggregation"; // 🆕 aggregation 추가
  width?: string; // 너비 (예: "50%", "200px", "1fr")
  editable: boolean; // 편집 가능 여부
  required?: boolean; // 필수 입력 여부
  placeholder?: string; // 플레이스홀더

  // Select 타입 옵션
  selectOptions?: { value: string; label: string }[];

  // 데이터 소스 설정 (어디서 조회?)
  sourceConfig?: ColumnSourceConfig;

  // 데이터 타겟 설정 (어디에 저장?)
  targetConfig?: ColumnTargetConfig;

  // Component 타입일 때
  componentType?: string; // 삽입할 컴포넌트 타입 (예: "simple-repeater-table")
  componentConfig?: any; // 컴포넌트 설정

  // 🆕 Aggregation 타입일 때 (집계값 표시)
  aggregationField?: string; // 표시할 집계 필드명 (GroupingConfig.aggregations의 resultField)
  
  // 🆕 스타일 설정
  textColor?: string; // 텍스트 색상
  fontSize?: "xs" | "sm" | "base" | "lg" | "xl" | "2xl"; // 폰트 크기
  fontWeight?: "normal" | "medium" | "semibold" | "bold"; // 폰트 굵기
}

/**
 * 컬럼 데이터 소스 설정 (SimpleRepeaterTable과 동일)
 */
export interface ColumnSourceConfig {
  type: "direct" | "join" | "manual"; // 조회 타입
  sourceTable?: string; // type: "direct" - 조회할 테이블
  sourceColumn?: string; // type: "direct" - 조회할 컬럼
  joinTable?: string; // type: "join" - 조인할 테이블
  joinColumn?: string; // type: "join" - 조인 테이블에서 가져올 컬럼
  joinKey?: string; // type: "join" - 현재 데이터의 조인 키 컬럼
  joinRefKey?: string; // type: "join" - 조인 테이블의 참조 키 컬럼
}

/**
 * 컬럼 데이터 타겟 설정 (SimpleRepeaterTable과 동일)
 */
export interface ColumnTargetConfig {
  targetTable: string; // 저장할 테이블
  targetColumn: string; // 저장할 컬럼
  saveEnabled?: boolean; // 저장 활성화 여부 (기본 true)
}

/**
 * 카드 데이터 (각 카드의 상태)
 */
export interface CardData {
  _cardId: string; // 카드 고유 ID
  _originalData: Record<string, any>; // 원본 데이터 (조회된 데이터)
  _isDirty: boolean; // 수정 여부
  [key: string]: any; // 실제 필드 데이터
}

/**
 * 🆕 그룹화된 카드 데이터
 */
export interface GroupedCardData {
  _cardId: string; // 카드 고유 ID
  _groupKey: string; // 그룹 키 값 (예: "PROD-001")
  _groupField: string; // 그룹 기준 필드명 (예: "part_code")
  _aggregations: Record<string, number>; // 집계 결과 (예: { total_balance_qty: 100 })
  _rows: CardRowData[]; // 그룹 내 각 행 데이터
  _representativeData: Record<string, any>; // 그룹 대표 데이터 (첫 번째 행 기준)
}

/**
 * 🆕 그룹 내 행 데이터
 */
export interface CardRowData {
  _rowId: string; // 행 고유 ID
  _originalData: Record<string, any>; // 원본 데이터
  _isDirty: boolean; // 수정 여부
  [key: string]: any; // 실제 필드 데이터
}

/**
 * 테이블 정보 (API 응답용)
 */
export interface TableInfo {
  tableName: string;
  displayName?: string;
}
