/**
 * 动态表单类型定义
 * 用于动态字段渲染器和表单设计器
 */

/** 字段类型枚举 */
export type FieldType =
  | 'text'           // 单行文本
  | 'textarea'       // 多行文本
  | 'number'         // 数字输入
  | 'date'           // 日期选择
  | 'select'         // 下拉选择
  | 'multiselect'    // 多选下拉
  | 'boolean'        // 开关/复选框
  | 'url'            // URL链接
  | 'email'          // 邮箱
  | 'phone'          // 手机号
  | 'tree'           // 树形选择

/** 字段验证规则 */
export interface ValidationRules {
  /** 最小值/最小长度 */
  min?: number
  /** 最大值/最大长度 */
  max?: number
  /** 正则表达式 */
  pattern?: string
  /** 自定义验证函数 */
  custom?: (value: any, allData: Record<string, any>) => boolean | string
  /** 自定义错误消息 */
  customMessage?: string
}

/** 字段配置 */
export interface FieldConfig {
  /** 字段唯一标识 */
  id: string
  /** 字段名称（用于提交数据） */
  name: string
  /** 字段标签（显示名称） */
  label: string
  /** 字段类型 */
  fieldType: FieldType
  /** 是否必填 */
  required?: boolean
  /** 默认值 */
  defaultValue?: any
  /** 占位符文本 */
  placeholder?: string
  /** 选项（用于select/multiselect） */
  options?: Array<{ label: string; value: any; disabled?: boolean }>
  /** 验证规则 */
  validationRules?: ValidationRules
  /** 栅格占列数（1-24） */
  span?: number
  /** 是否显示（支持函数动态控制） */
  visible?: boolean | ((data: Record<string, any>) => boolean)
  /** 是否禁用（支持函数动态控制） */
  disabled?: boolean | ((data: Record<string, any>) => boolean)
  /** 字段描述 */
  description?: string
  /** 自定义类名 */
  className?: string
  /** 树形数据（用于tree类型） */
  treeData?: TreeNode[]
  /** 是否多选（用于tree类型） */
  multiple?: boolean
}

/** 树形节点 */
export interface TreeNode {
  id: string | number
  label: string
  children?: TreeNode[]
  disabled?: boolean
}

/** 表单数据 */
export type FormData = Record<string, any>

/** 验证结果 */
export interface ValidationResult {
  /** 是否验证通过 */
  isValid: boolean
  /** 错误信息 */
  errors: string[]
}

/** 表单验证状态 */
export interface FormValidationState {
  /** 整个表单是否有效 */
  isValid: boolean
  /** 字段级错误信息 */
  errors: Record<string, string[]>
}

/** 字段变更事件 */
export interface FieldChangeEvent {
  /** 字段名称 */
  fieldName: string
  /** 字段值 */
  value: any
  /** 旧值 */
  oldValue?: any
}

/** 字段联动配置 */
export interface FieldDependency {
  /** 源字段（触发联动的字段） */
  sourceField: string
  /** 目标字段（被联动的字段） */
  targetField: string
  /** 联动类型 */
  type: 'show' | 'hide' | 'enable' | 'disable' | 'setValue' | 'setOptions'
  /** 触发条件函数 */
  condition: (sourceValue: any, allData: Record<string, any>) => boolean
  /** 联动动作 */
  action?: (targetValue: any, sourceValue: any, allData: Record<string, any>) => any
}

/** 表单组件Props */
export interface DynamicFormProps {
  /** 设备类型ID */
  deviceTypeId?: string | number
  /** 字段配置列表 */
  fields: FieldConfig[]
  /** 表单数据（v-model） */
  modelValue: FormData
  /** 是否只读模式 */
  readonly?: boolean
  /** 标签宽度 */
  labelWidth?: string | number
  /** 标签位置 */
  labelPosition?: 'left' | 'right' | 'top'
  /** 栅格间隔 */
  gutter?: number
  /** 字段联动配置 */
  dependencies?: FieldDependency[]
}

/** 表单组件Emits */
export interface DynamicFormEmits {
  /** 更新表单数据 */
  (e: 'update:modelValue', value: FormData): void
  /** 字段值变更 */
  (e: 'field-change', event: FieldChangeEvent): void
  /** 验证状态变更 */
  (e: 'validation-change', state: FormValidationState): void
  /** 表单提交 */
  (e: 'submit', data: FormData): void
}

/** 字段设计器Props */
export interface FieldDesignerProps {
  /** 字段配置列表（v-model） */
  modelValue: FieldConfig[]
  /** 是否只读模式 */
  readonly?: boolean
}

/** 字段设计器Emits */
export interface FieldDesignerEmits {
  /** 更新字段配置 */
  (e: 'update:modelValue', value: FieldConfig[]): void
  /** 预览字段配置 */
  (e: 'preview', fields: FieldConfig[]): void
}

/** 表单操作方法 */
export interface FormActions {
  /** 设置字段值 */
  setFieldValue: (field: string, value: any) => void
  /** 获取字段值 */
  getFieldValue: (field: string) => any
  /** 验证单个字段 */
  validateField: (field: string) => Promise<boolean>
  /** 验证整个表单 */
  validateAll: () => Promise<boolean>
  /** 重置表单 */
  resetForm: () => void
  /** 设置表单数据 */
  setFormData: (data: FormData) => void
  /** 获取表单数据 */
  getFormData: () => FormData
  /** 清除验证 */
  clearValidation: () => void
}
