/**
 * 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';

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

/**
 * 조건부 표시 설정 - 개별 조건
 */
export interface FieldConditionConfig {
  fieldKey: string;           // 조건을 가진 필드의 키
  expectedValue: string;      // 이 값일 때
  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[];
}


// ============================================
// 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;
}

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

/**
 * 필드 타입별 입력 컴포넌트 매핑
 */
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;