/**
 * DynamicItemForm 타입 정의
 *
 * 품목기준관리 API 기반 동적 폼 렌더링용 타입
 */

import type {
  ItemPageResponse,
  ItemSectionResponse,
  ItemFieldResponse,
  BomItemResponse,
  PageStructureResponse,
} from '@/types/item-master-api';

// Re-export types for hooks
export type { ItemFieldResponse } from '@/types/item-master-api';
export type { ItemType } from '@/types/item';

// ============================================
// 조건부 표시 타입
// ============================================

/**
 * 조건부 표시 연산자
 * - equals: 기본값 (하위호환), 정확히 일치
 * - not_equals: 불일치
 * - in: expectedValue를 콤마 구분 목록으로 해석, 그 중 하나에 일치
 * - not_in: 콤마 구분 목록 중 어느 것에도 불일치
 * - greater_than / less_than / gte / lte: 숫자 비교
 * - contains: 부분 문자열 포함
 */
export type ConditionOperator =
  | 'equals'
  | 'not_equals'
  | 'in'
  | 'not_in'
  | 'greater_than'
  | 'less_than'
  | 'gte'
  | 'lte'
  | 'contains';

/**
 * 조건부 표시 설정 - 개별 조건
 */
export interface FieldConditionConfig {
  fieldKey: string;           // 조건을 가진 필드의 키
  operator?: ConditionOperator; // 기본: "equals" (하위호환)
  expectedValue: string;      // 이 값일 때 (in/not_in은 콤마 구분)
  targetFieldIds?: string[];  // 이 필드들 표시
  targetSectionIds?: string[]; // 이 섹션들 표시
}

/**
 * 필드의 display_condition 구조
 */
export interface DisplayCondition {
  targetType: 'field' | 'section';
  fieldConditions?: FieldConditionConfig[];
  sectionIds?: string[]; // legacy 지원
}

/**
 * 단순화된 단위 옵션 타입 (필드 컴포넌트용)
 */
export interface SimpleUnitOption {
  label: string;
  value: string;
}

// ============================================
// 폼 구조 타입
// ============================================

/**
 * 동적 폼에 사용되는 페이지 구조
 */
export interface DynamicFormStructure {
  page: ItemPageResponse;
  sections: DynamicSection[];
  directFields: DynamicField[];
}

/**
 * 동적 섹션 (순서 포함)
 */
export interface DynamicSection {
  section: ItemSectionResponse;
  orderNo: number;
  fields: DynamicField[];
  bomItems: DynamicBomItem[];
}

/**
 * 동적 필드 (순서 포함)
 */
export interface DynamicField {
  field: ItemFieldResponse;
  orderNo: number;
}

/**
 * 동적 BOM 항목 (순서 포함)
 */
export interface DynamicBomItem {
  bomItem: BomItemResponse;
  orderNo: number;
}

// ============================================
// BOM 관련 타입
// ============================================

/**
 * BOM 라인 (폼에서 사용하는 BOM 항목)
 */
export interface BOMLine {
  id: string;
  childItemId?: string;       // 자품목 ID (API에서 받은 품목 id)
  childItemType?: 'PRODUCT' | 'MATERIAL';  // 자품목 타입 (PRODUCT: FG/PT, MATERIAL: SM/RM/CS)
  childItemCode: string;
  childItemName: string;
  specification?: string;
  material?: string;
  quantity: number;
  unit: string;
  unitPrice?: number;
  note?: string;
  isBending?: boolean;
  bendingDiagram?: string;
}

/**
 * BOM 검색 상태
 */
export interface BOMSearchState {
  searchValue: string;
  isOpen: boolean;
}

// ============================================
// 폼 상태 타입
// ============================================

/**
 * 동적 폼 필드 값 타입
 */
export type DynamicFieldValue = string | number | boolean | string[] | null | undefined | Record<string, unknown>[] | Record<string, unknown>;

/**
 * 동적 폼 데이터 (field_key를 key로 사용)
 */
export type DynamicFormData = Record<string, DynamicFieldValue>;

/**
 * 동적 폼 에러
 */
export type DynamicFormErrors = Record<string, string>;

// ============================================
// 컴포넌트 Props 타입
// ============================================

/**
 * 품목 저장 결과 (파일 업로드에 필요한 ID 포함)
 */
export interface ItemSaveResult {
  id: number;
  [key: string]: unknown;
}

/**
 * DynamicItemForm 메인 컴포넌트 Props
 */
export interface DynamicItemFormProps {
  mode: 'create' | 'edit';
  itemType?: 'FG' | 'PT' | 'SM' | 'RM' | 'CS';
  itemId?: number;  // edit 모드에서 파일 업로드에 사용
  initialData?: DynamicFormData;
  /** edit 모드에서 초기 BOM 데이터 */
  initialBomLines?: BOMLine[];
  /** 품목 저장 후 결과 반환 (create: id 필수, edit: id 선택) */
  onSubmit: (data: DynamicFormData) => Promise<ItemSaveResult | void>;
}

/**
 * 동적 필드 렌더러 Props
 */
export interface DynamicFieldRendererProps {
  field: ItemFieldResponse;
  value: DynamicFieldValue;
  onChange: (value: DynamicFieldValue) => void;
  error?: string;
  disabled?: boolean;
  unitOptions?: SimpleUnitOption[];
  /** ComputedField에서 다른 필드 값 참조용 */
  formData?: DynamicFormData;
}


// ============================================
// Hook 반환 타입
// ============================================

/**
 * useFormStructure 훅 반환 타입
 */
export interface UseFormStructureResult {
  structure: DynamicFormStructure | null;
  isLoading: boolean;
  error: string | null;
  unitOptions: SimpleUnitOption[];
  refetch: () => Promise<void>;
}

/**
 * useDynamicFormState 훅 반환 타입
 */
export interface UseDynamicFormStateResult {
  formData: DynamicFormData;
  errors: DynamicFormErrors;
  isSubmitting: boolean;
  setFieldValue: (fieldKey: string, value: DynamicFieldValue) => void;
  setError: (fieldKey: string, error: string) => void;
  clearError: (fieldKey: string) => void;
  clearAllErrors: () => void;
  validateField: (field: ItemFieldResponse, value: DynamicFieldValue) => string | null;
  validateAll: (fields: ItemFieldResponse[]) => boolean;
  handleSubmit: (onSubmit: (data: DynamicFormData) => Promise<void>) => Promise<void>;
  resetForm: (initialData?: DynamicFormData) => void;
}

// ============================================
// 확장 필드 config 타입 (Phase 1~3)
// ============================================

/**
 * Reference 필드 properties config
 */
export interface ReferenceConfig {
  source: string;              // "vendors" | "items" | "customers" 등
  displayField?: string;       // 기본 "name"
  valueField?: string;         // 기본 "id"
  searchFields?: string[];     // 기본 ["name"]
  searchApiUrl?: string;       // source="custom"일 때 필수
  columns?: Array<{ key: string; label: string; width?: string }>;
  displayFormat?: string;      // "{code} - {name}"
  returnFields?: string[];     // ["id", "code", "name"]
}

/**
 * MultiSelect 필드 properties config
 */
export interface MultiSelectConfig {
  maxSelections?: number;      // 최대 선택 수 (기본: 무제한)
  allowCustom?: boolean;       // 직접 입력 허용 (기본: false)
  layout?: 'chips' | 'list';  // 기본: "chips"
}

/**
 * File 필드 properties config
 */
export interface FileConfig {
  accept?: string;             // ".pdf,.doc" (기본: "*")
  maxSize?: number;            // bytes (기본: 10MB = 10485760)
  maxFiles?: number;           // 기본: 1
  preview?: boolean;           // 이미지 미리보기 (기본: true)
  category?: string;           // 파일 카테고리 태그
}

/**
 * Currency 필드 properties config
 */
export interface CurrencyConfig {
  currency?: string;           // 기본: "KRW"
  precision?: number;          // 기본: 0
  showSymbol?: boolean;        // 기본: true
  allowNegative?: boolean;     // 기본: false
}

/**
 * UnitValue 필드 properties config
 */
export interface UnitValueConfig {
  units: Array<{ label: string; value: string }>;
  defaultUnit?: string;
  precision?: number;
}

/**
 * Toggle 필드 properties config
 */
export interface ToggleConfig {
  onLabel?: string;            // 기본: "ON"
  offLabel?: string;           // 기본: "OFF"
  onValue?: string;            // 기본: "true"
  offValue?: string;           // 기본: "false"
}

/**
 * Computed 필드 properties config
 */
export interface ComputedConfig {
  formula: string;             // "price * quantity"
  dependsOn: string[];         // ["price", "quantity"]
  format?: string;             // "currency" | "number" | "percent"
  precision?: number;
}

/**
 * Reference 소스 프리셋 엔트리
 */
export interface ReferenceSourcePreset {
  apiUrl: string;
  displayField: string;
  valueField: string;
  searchFields: string[];
  columns: Array<{ key: string; label: string; width?: string }>;
}

/**
 * 테이블 컬럼 config
 */
export interface TableColumnConfig {
  key: string;
  label: string;
  width?: string;
  fieldType: string;           // ItemFieldType
  options?: Array<{ label: string; value: string }>;
  properties?: Record<string, unknown>;
  isRequired?: boolean;
  isReadonly?: boolean;
}

/**
 * 테이블 섹션 config (properties에서 읽음)
 */
export interface TableConfig {
  columns: TableColumnConfig[];
  minRows?: number;
  maxRows?: number;
  summaryRow?: Array<{
    columnKey: string;
    type: 'sum' | 'avg' | 'count' | 'label';
    label?: string;
  }>;
}

// ============================================
// 유틸리티 타입
// ============================================

/**
 * 필드 타입별 입력 컴포넌트 매핑
 */
export type FieldTypeComponentMap = {
  textbox: 'TextField';
  number: 'NumberField';
  dropdown: 'DropdownField';
  checkbox: 'CheckboxField';
  date: 'DateField';
  textarea: 'TextareaField';
};

/**
 * API 응답을 DynamicFormStructure로 변환
 */
export function convertToFormStructure(
  response: PageStructureResponse
): DynamicFormStructure {
  return {
    page: response.page,
    sections: response.sections.map((s) => ({
      section: s.section,
      orderNo: s.order_no,
      fields: s.fields.map((f) => ({
        field: f.field,
        orderNo: f.order_no,
      })),
      bomItems: s.bom_items.map((b) => ({
        bomItem: b.bom_item,
        orderNo: b.order_no,
      })),
    })),
    directFields: response.direct_fields.map((f) => ({
      field: f.field,
      orderNo: f.order_no,
    })),
  };
}

// ============================================
// 타입 별칭 (하위 호환성)
// ============================================

/**
 * StructuredFieldConfig는 DynamicFormStructure의 별칭
 * (hooks에서 사용하는 이름)
 */
export type StructuredFieldConfig = DynamicFormStructure;