/**
 * V2Repeater 컴포넌트 타입 정의
 *
 * 렌더링 모드:
 * - inline: 현재 테이블 컬럼 직접 입력 (simple-repeater-table)
 * - modal: 소스 테이블에서 검색/선택 후 복사 (modal-repeater-table)
 * - mixed: inline + modal 혼합
 */

// 렌더링 모드
export type RepeaterRenderMode = "inline" | "modal";

// 모달 크기
export type ModalSize = "sm" | "md" | "lg" | "xl" | "full";

// 컬럼 너비 옵션
export type ColumnWidthOption = "auto" | "60px" | "80px" | "100px" | "120px" | "150px" | "200px" | "250px" | "300px";

// 자동 입력 타입
export type AutoFillType =
  | "none" // 자동 입력 없음
  | "currentDate" // 현재 날짜
  | "currentDateTime" // 현재 날짜+시간
  | "sequence" // 순번 (1, 2, 3...)
  | "numbering" // 채번 규칙 (관리자가 등록한 규칙 선택)
  | "fromMainForm" // 메인 폼에서 값 복사
  | "fixed" // 고정값
  | "parentSequence"; // 부모 채번 + 순번 (예: WO-20260223-005-01)

// 자동 입력 설정
export interface AutoFillConfig {
  type: AutoFillType;
  // fromMainForm 타입용
  sourceField?: string; // 메인 폼에서 복사할 필드명
  // fixed 타입용
  fixedValue?: string | number | boolean;
  // numbering 타입용 - 기존 채번 규칙 ID를 참조
  numberingRuleId?: string; // 채번 규칙 ID (numbering_rules 테이블)
  selectedMenuObjid?: number; // 🆕 채번 규칙 선택을 위한 대상 메뉴 OBJID
  // parentSequence 타입용
  parentField?: string; // 메인 폼에서 부모 번호를 가져올 필드명
  separator?: string; // 부모 번호와 순번 사이 구분자 (기본: "-")
  sequenceLength?: number; // 순번 자릿수 (기본: 2 → 01, 02, 03)
}

// 컬럼 설정
export interface RepeaterColumnConfig {
  key: string;
  title: string;
  width: ColumnWidthOption;
  visible: boolean;
  editable?: boolean; // 편집 가능 여부 (inline 모드)
  hidden?: boolean; // 히든 처리 (화면에 안 보이지만 저장됨)
  isJoinColumn?: boolean;
  sourceTable?: string;
  // 소스 테이블 표시 컬럼 여부 (modal 모드에서 읽기 전용으로 표시)
  isSourceDisplay?: boolean;
  // 소스 데이터의 다른 컬럼명에서 값을 매핑 (예: qty ← order_qty)
  sourceKey?: string;
  // 입력 타입 (테이블 타입 관리의 inputType을 따름)
  inputType?: string; // text, number, date, code, entity 등
  // 🆕 자동 입력 설정
  autoFill?: AutoFillConfig;
  // 입력 타입별 상세 설정
  detailSettings?: {
    codeGroup?: string; // code 타입용
    referenceTable?: string; // entity 타입용
    referenceColumn?: string;
    displayColumn?: string;
    format?: string; // date, number 타입용
    categoryRef?: string; // 🆕 category 타입용 - 카테고리 참조 ID
  };
}

// 모달 표시 컬럼 (라벨 포함)
export interface ModalDisplayColumn {
  key: string;
  label: string;
}

// 모달 설정
export interface RepeaterModalConfig {
  // 기본 설정
  size: ModalSize;
  title?: string; // 모달 제목
  buttonText?: string; // 검색 버튼 텍스트

  // 소스 테이블 표시 설정 (modal 모드)
  sourceDisplayColumns?: ModalDisplayColumn[]; // 모달에 표시할 소스 테이블 컬럼 (라벨 포함)
  searchFields?: string[]; // 검색에 사용할 필드

  // 화면 기반 모달 (옵션)
  screenId?: number;
  titleTemplate?: {
    prefix?: string;
    columnKey?: string;
    suffix?: string;
  };
}

// 기능 옵션
export interface RepeaterFeatureOptions {
  showAddButton: boolean;
  showDeleteButton: boolean;
  inlineEdit: boolean;
  dragSort: boolean;
  showRowNumber: boolean;
  selectable: boolean;
  multiSelect: boolean;
}

// 데이터 소스 설정
export interface RepeaterDataSource {
  // inline 모드: 현재 테이블 설정은 필요 없음 (컬럼만 선택)
  tableName?: string; // 데이터 테이블명 (레거시 호환)

  // modal 모드: 소스 테이블 설정
  sourceTable?: string; // 검색할 테이블 (엔티티 참조 테이블)
  foreignKey?: string; // 현재 테이블의 FK 컬럼 (part_objid 등)
  referenceKey?: string; // 소스 테이블의 PK 컬럼 (id 등)
  displayColumn?: string; // 표시할 컬럼 (item_name 등)

  // 추가 필터
  filter?: {
    column: string;
    value: string;
  };
}

// 컬럼 매핑 (modal 모드에서 소스→타겟 복사용)
export interface ColumnMapping {
  sourceColumn: string;
  targetColumn: string;
  transform?: "copy" | "reference"; // copy: 값 복사, reference: ID 참조
}

// 계산 규칙
export interface CalculationRule {
  id: string;
  targetColumn: string;
  formula: string; // 예: "quantity * unit_price"
  label?: string;
}

// Entity 조인 설정 (리피터 컬럼의 FK를 참조 테이블과 조인하여 표시)
export interface RepeaterEntityJoin {
  sourceColumn: string;       // FK 컬럼 (예: "item_id")
  referenceTable: string;     // 참조 테이블 (예: "item_info")
  columns: Array<{
    referenceField: string;   // 참조 테이블 컬럼 (예: "item_name")
    displayField: string;     // 리피터 표시 컬럼 키 (예: "item_name")
  }>;
}

// 소스 디테일 설정 (모달에서 전달받은 마스터 데이터의 디테일을 자동 조회)
export interface SourceDetailConfig {
  tableName: string;      // 디테일 테이블명 (예: "sales_order_detail")
  foreignKey: string;     // 디테일 테이블의 FK 컬럼 (예: "order_no")
  parentKey: string;      // 전달받은 마스터 데이터에서 추출할 키 (예: "order_no")
  useEntityJoin?: boolean; // 엔티티 조인 사용 여부 (data-with-joins API)
  columnMapping?: Record<string, string>; // 리피터 컬럼 ← 조인 alias 매핑 (예: { "part_name": "part_code_item_name" })
  additionalJoinColumns?: Array<{
    sourceColumn: string;
    sourceTable: string;
    joinAlias: string;
  }>;
}

// 메인 설정 타입
export interface V2RepeaterConfig {
  // 렌더링 모드
  renderMode: RepeaterRenderMode;

  // 🆕 저장 대상 테이블 설정 (화면 메인 테이블과 다른 테이블에 저장할 경우)
  mainTableName?: string; // 리피터 데이터가 저장될 테이블명 (미설정 시 화면 메인 테이블)
  useCustomTable?: boolean; // true면 mainTableName 사용
  foreignKeyColumn?: string; // 마스터 테이블과 연결할 FK 컬럼명 (예: receiving_id)
  foreignKeySourceColumn?: string; // 마스터 테이블의 PK 컬럼명 (예: id) - 자동 연결용

  // 소스 디테일 자동 조회 설정 (선택된 마스터의 디테일 행을 리피터로 로드)
  sourceDetailConfig?: SourceDetailConfig;

  // 데이터 소스 설정
  dataSource: RepeaterDataSource;

  // 컬럼 설정 (inline: 입력 컬럼, modal: 표시 컬럼)
  columns: RepeaterColumnConfig[];

  // 컬럼 매핑 (modal 모드)
  columnMappings?: ColumnMapping[];

  // 계산 규칙 (modal 모드)
  calculationRules?: CalculationRule[];

  // 모달 설정 (modal, mixed 모드)
  modal?: RepeaterModalConfig;

  // Entity 조인 설정 (FK 기반으로 참조 테이블 데이터를 자동 해석하여 표시)
  entityJoins?: RepeaterEntityJoin[];

  // 기능 옵션
  features: RepeaterFeatureOptions;

  // 스타일
  style?: {
    maxHeight?: string;
    minHeight?: string;
    borderless?: boolean;
    compact?: boolean;
  };
}

// 컴포넌트 Props
export interface V2RepeaterProps {
  config: V2RepeaterConfig;
  componentId?: string; // ScreenContext DataReceiver 등록용
  parentId?: string | number; // 부모 레코드 ID
  data?: any[]; // 초기 데이터 (없으면 API로 로드)
  onDataChange?: (data: any[]) => void;
  onRowClick?: (row: any) => void;
  onButtonClick?: (action: string, row?: any, buttonConfig?: any) => void;
  className?: string;
  formData?: Record<string, any>; // 수정 모드에서 FK 기반 데이터 로드용
  groupedData?: Record<string, any>[]; // 모달에서 전달받은 선택 데이터 (소스 디테일 조회용)
}

// 기본 설정값
export const DEFAULT_REPEATER_CONFIG: V2RepeaterConfig = {
  renderMode: "inline",
  dataSource: {},
  columns: [],
  modal: {
    size: "lg",
    sourceDisplayColumns: [],
    searchFields: [],
  },
  features: {
    showAddButton: true,
    showDeleteButton: true,
    inlineEdit: true,
    dragSort: false,
    showRowNumber: false,
    selectable: false,
    multiSelect: true,
  },
};

// 고정 옵션들 (콤보박스용)
export const RENDER_MODE_OPTIONS = [
  { value: "inline", label: "인라인 (직접 입력)" },
  { value: "modal", label: "모달 (검색 선택)" },
] as const;

export const MODAL_SIZE_OPTIONS = [
  { value: "sm", label: "작게 (sm)" },
  { value: "md", label: "중간 (md)" },
  { value: "lg", label: "크게 (lg)" },
  { value: "xl", label: "매우 크게 (xl)" },
  { value: "full", label: "전체 화면" },
] as const;

export const COLUMN_WIDTH_OPTIONS = [
  { value: "auto", label: "자동" },
  { value: "60px", label: "60px" },
  { value: "80px", label: "80px" },
  { value: "100px", label: "100px" },
  { value: "120px", label: "120px" },
  { value: "150px", label: "150px" },
  { value: "200px", label: "200px" },
  { value: "250px", label: "250px" },
  { value: "300px", label: "300px" },
] as const;
