/**
 * 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 타입용
  source_field?: string; // 메인 폼에서 복사할 필드명
  // fixed 타입용
  fixed_value?: string | number | boolean;
  // numbering 타입용 - 기존 채번 규칙 ID를 참조
  numbering_rule_id?: string; // 채번 규칙 ID (numbering_rules 테이블)
  selected_menu_objid?: number; // 🆕 채번 규칙 선택을 위한 대상 메뉴 OBJID
  // parentSequence 타입용
  parent_field?: string; // 메인 폼에서 부모 번호를 가져올 필드명
  separator?: string; // 부모 번호와 순번 사이 구분자 (기본: "-")
  sequence_length?: number; // 순번 자릿수 (기본: 2 → 01, 02, 03)
}

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

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

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

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

  // 화면 기반 모달 (옵션)
  screen_id?: number;
  title_template?: {
    prefix?: string;
    column_key?: string;
    suffix?: string;
  };
}

// 기능 옵션
export interface RepeaterFeatureOptions {
  show_add_button: boolean;
  show_delete_button: boolean;
  inline_edit: boolean;
  drag_sort: boolean;
  show_row_number: boolean;
  selectable: boolean;
  multi_select: boolean;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  // 기능 옵션
  features: RepeaterFeatureOptions;

  // 스타일
  style?: {
    max_height?: string;
    min_height?: string;
    borderless?: boolean;
    compact?: boolean;
  };
}

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

// 기본 설정값
export const DEFAULT_REPEATER_CONFIG: V2RepeaterConfig = {
  render_mode: "inline",
  data_source: {},
  columns: [],
  modal: {
    size: "lg",
    source_display_columns: [],
    search_fields: [],
  },
  features: {
    show_add_button: true,
    show_delete_button: true,
    inline_edit: true,
    drag_sort: false,
    show_row_number: false,
    selectable: false,
    multi_select: 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;
