"use client";

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

/**
 * 추가 입력 필드 정의
 */
export interface AdditionalFieldDefinition {
  /** 필드명 (컬럼명) */
  name: string;
  /** 필드 라벨 */
  label: string;
  /** 입력 타입 */
  type: "text" | "number" | "date" | "select" | "checkbox" | "textarea";
  /** 🆕 데이터베이스 inputType (실제 렌더링 시 사용) */
  inputType?: string;
  /** 🆕 코드 카테고리 (inputType이 code/category일 때) */
  codeCategory?: string;
  /** 필수 입력 여부 */
  required?: boolean;
  /** 플레이스홀더 */
  placeholder?: string;
  /** 기본값 */
  defaultValue?: any;
  /** 🆕 원본 데이터에서 자동으로 값을 가져올 필드명 */
  autoFillFrom?: string;
  /** 🆕 자동 채우기할 데이터의 테이블명 (비워두면 주 데이터 소스 사용) */
  autoFillFromTable?: string;
  /** 선택 옵션 (type이 select일 때) */
  options?: Array<{ label: string; value: string }>;
  /** 필드 너비 (px 또는 %) */
  width?: string;
  /** 🆕 필드 그룹 ID (같은 그룹ID를 가진 필드들은 같은 카드에 표시) */
  groupId?: string;
  /** 검증 규칙 */
  validation?: {
    min?: number;
    max?: number;
    minLength?: number;
    maxLength?: number;
    pattern?: string;
  };
}

/**
 * 필드 그룹 정의
 */
export interface FieldGroup {
  /** 그룹 ID */
  id: string;
  /** 그룹 제목 */
  title: string;
  /** 그룹 설명 (선택사항) */
  description?: string;
  /** 그룹 표시 순서 */
  order?: number;
  /** 🆕 최대 항목 수 (1이면 1:1 관계 - 자동 생성, + 추가 버튼 숨김) */
  maxEntries?: number;
  /** 🆕 이 그룹의 소스 테이블 (카테고리 옵션 로드 시 사용) */
  sourceTable?: string;
  /** 🆕 이 그룹의 항목 표시 설정 (그룹별로 다른 표시 형식 가능) */
  displayItems?: DisplayItem[];
}

/**
 * 🆕 계산식 노드 타입
 */
export type CalculationNodeType = "field" | "constant" | "operation" | "function" | "previous";

export interface CalculationNode {
  type: CalculationNodeType;
  // field: 필드명
  fieldName?: string;
  // constant: 상수값
  value?: number;
  // operation: 연산
  operator?: "+" | "-" | "*" | "/" | "%" | "^";
  left?: CalculationNode;
  right?: CalculationNode;
  // function: 함수
  functionName?: "round" | "floor" | "ceil" | "abs" | "max" | "min";
  params?: CalculationNode[];
}

/**
 * 🆕 계산 단계
 */
export interface CalculationStep {
  id: string;
  label: string;
  expression: CalculationNode;
}

/**
 * 🆕 자동 계산 설정
 */
export interface AutoCalculationConfig {
  /** 계산 대상 필드명 (예: calculated_price) */
  targetField: string;
  /** 🆕 계산 방식 */
  mode: "template" | "custom";
  
  /** 템플릿 모드 (기존 방식) */
  inputFields?: {
    basePrice: string;
    discountType: string;
    discountValue: string;
    roundingType: string;
    roundingUnit: string;
  };
  calculationType?: "price" | "custom";
  valueMapping?: {
    discountType?: {
      [valueCode: string]: "none" | "rate" | "amount";
    };
    roundingType?: {
      [valueCode: string]: "none" | "round" | "floor" | "ceil";
    };
    roundingUnit?: {
      [valueCode: string]: number;
    };
  };
  
  /** 커스텀 모드 (계산식 빌더) */
  calculationSteps?: CalculationStep[];
}

/**
 * 🆕 부모 화면 데이터 매핑 설정
 */
export interface ParentDataMapping {
  /** 소스 테이블명 (필수) */
  sourceTable: string;
  /** 소스 테이블의 필드명 */
  sourceField: string;
  /** 저장할 테이블의 필드명 */
  targetField: string;
  /** 부모 데이터가 없을 때 사용할 기본값 (선택사항) */
  defaultValue?: any;
}

/**
 * 자동 감지된 FK 매핑 정보
 * table_type_columns의 entity 설정을 기반으로 자동 감지
 */
export interface AutoDetectedFk {
  /** 대상 테이블의 FK 컬럼명 (예: item_id, customer_id) */
  columnName: string;
  /** 컬럼 라벨 (예: 품목 ID) */
  columnLabel?: string;
  /** 참조 테이블명 (예: item_info, customer_mng) */
  referenceTable: string;
  /** 참조 컬럼명 (예: item_number, customer_code) */
  referenceColumn: string;
  /** 매핑 유형: source(원본 데이터 FK) 또는 parent(부모 화면 FK) */
  mappingType: "source" | "parent" | "unknown";
}

/**
 * SelectedItemsDetailInput 컴포넌트 설정 타입
 */
export interface SelectedItemsDetailInputConfig extends ComponentConfig {
  /**
   * 데이터 소스 ID (TableList 컴포넌트 ID 등)
   * 이 ID를 통해 modalDataStore에서 데이터를 가져옴
   */
  dataSourceId?: string;
  
  /**
   * 🆕 원본 데이터 테이블명 (표시 컬럼 선택 시 사용)
   * 예: "item_info"
   */
  sourceTable?: string;
  
  /**
   * 원본 데이터의 키 필드명 (대상 테이블에서 원본을 참조하는 FK 컬럼)
   * 예: item_info 기반이면 "item_id", customer_mng 기반이면 "customer_id"
   * 미설정 시 엔티티 설정에서 자동 감지
   */
  sourceKeyField?: string;
  
  /**
   * 표시할 원본 데이터 컬럼들 (name, label, width)
   * 원본 데이터 테이블의 컬럼을 표시
   */
  displayColumns?: Array<{ name: string; label: string; width?: string }>;
  
  /**
   * 추가 입력 필드 정의
   * 저장 대상 테이블의 컬럼을 입력
   */
  additionalFields?: AdditionalFieldDefinition[];
  
  /**
   * 🆕 필드 그룹 정의
   * 추가 입력 필드를 여러 카드로 나눠서 표시
   */
  fieldGroups?: FieldGroup[];
  
  /**
   * 저장 대상 테이블
   */
  targetTable?: string;
  
  /**
   * 🆕 부모 화면 데이터 매핑
   * 이전 화면(예: 거래처 테이블)에서 넘어온 데이터를 저장 테이블의 필드에 자동 매핑
   * 예: { sourceField: "id", targetField: "customer_id" }
   */
  parentDataMapping?: ParentDataMapping[];
  
  /**
   * 🆕 자동 계산 설정
   * 특정 필드가 변경되면 다른 필드를 자동으로 계산
   */
  autoCalculation?: AutoCalculationConfig;
  
  /**
   * 레이아웃 모드
   * - grid: 테이블 형식 (기본)
   * - card: 카드 형식
   */
  layout?: "grid" | "card";
  
  /**
   * 항목 번호 표시 여부
   */
  showIndex?: boolean;
  
  /**
   * 항목 삭제 허용 여부
   */
  allowRemove?: boolean;
  
  /**
   * 🆕 입력 모드
   * - inline: 항상 입력창 표시 (기본)
   * - modal: 추가 버튼 클릭 시 입력창 표시, 완료 후 작은 카드로 표시
   */
  inputMode?: "inline" | "modal";
  
  /**
   * 빈 상태 메시지
   */
  emptyMessage?: string;
  
  // 공통 설정
  disabled?: boolean;
  readonly?: boolean;
}

/**
 * 🆕 그룹별 입력 항목 (예: 그룹1의 한 줄)
 */
export interface GroupEntry {
  /** 입력 항목 고유 ID */
  id: string;
  /** 입력된 필드 데이터 */
  [key: string]: any;
}

/**
 * 🆕 표시 항목 타입
 */
export type DisplayItemType = "icon" | "field" | "text" | "badge";

/**
 * 🆕 빈 값 처리 방식
 */
export type EmptyBehavior = "hide" | "default" | "blank";

/**
 * 🆕 필드 표시 형식
 */
export type DisplayFieldFormat = "text" | "date" | "currency" | "number" | "badge";

/**
 * 🆕 표시 항목 정의 (아이콘, 필드, 텍스트, 배지)
 */
export interface DisplayItem {
  /** 항목 타입 */
  type: DisplayItemType;
  
  /** 고유 ID */
  id: string;
  
  // === type: "field" 인 경우 ===
  /** 필드명 (컬럼명) */
  fieldName?: string;
  /** 라벨 (예: "거래처:", "단가:") */
  label?: string;
  /** 표시 형식 */
  format?: DisplayFieldFormat;
  /** 빈 값일 때 동작 */
  emptyBehavior?: EmptyBehavior;
  /** 기본값 (빈 값일 때 표시) */
  defaultValue?: string;
  
  // === type: "icon" 인 경우 ===
  /** 아이콘 이름 (lucide-react 아이콘명) */
  icon?: string;
  
  // === type: "text" 인 경우 ===
  /** 텍스트 내용 */
  value?: string;
  
  // === type: "badge" 인 경우 ===
  /** 배지 스타일 */
  badgeVariant?: "default" | "secondary" | "destructive" | "outline";
  
  // === 공통 스타일 ===
  /** 굵게 표시 */
  bold?: boolean;
  /** 밑줄 표시 */
  underline?: boolean;
  /** 기울임 표시 */
  italic?: boolean;
  /** 텍스트 색상 */
  color?: string;
  /** 배경 색상 */
  backgroundColor?: string;
}

/**
 * 🆕 품목 + 그룹별 여러 입력 항목
 * 각 필드 그룹마다 독립적으로 여러 개의 입력을 추가할 수 있음
 * 예: { "group1": [entry1, entry2], "group2": [entry1, entry2, entry3] }
 */
export interface ItemData {
  /** 품목 고유 ID */
  id: string;
  /** 원본 데이터 (품목 정보) */
  originalData: Record<string, any>;
  /** 필드 그룹별 입력 항목들 { groupId: [entry1, entry2, ...] } */
  fieldGroups: Record<string, GroupEntry[]>;
}

/**
 * SelectedItemsDetailInput 컴포넌트 Props 타입
 */
export interface SelectedItemsDetailInputProps {
  id?: string;
  name?: string;
  value?: any;
  config?: SelectedItemsDetailInputConfig;
  className?: string;
  style?: React.CSSProperties;
  
  // 이벤트 핸들러
  onChange?: (value: any) => void;
  onSave?: (data: any[]) => void;
}
