import type { ColProps } from "antd/es/col";
import type { FormItemProps, Rule } from "antd/es/form";
import type { FormListFieldData } from "antd/es/form/FormList";
import type { Gutter } from "antd/es/grid/row";
import type { NamePath } from "rc-field-form/lib/interface";
import type { FC, ReactNode } from "react";
import type { FORM_ITEM_RENDER_ENUM } from "../../enum/formItemRender";

/**
 * 表单项渲染类型
 */
export type FormItemRenderType
  = | (typeof FORM_ITEM_RENDER_ENUM)[keyof typeof FORM_ITEM_RENDER_ENUM]
    | ReactNode;

/**
 * 选项项数据类型
 */
export interface OptionItem {
  /** ID字段 */
  bianma?: any;
  /** 名称字段 */
  name?: string;
  [key: string]: any;
}

/**
 * 字段键配置
 */
export interface itemsFieldConfig {
  /** 值字段的键名，默认为 'bianma' */
  valueKey?: string;
  /** 标签字段的键名，默认为 'name' */
  labelKey?: string | ((item: Record<string, any>) => ReactNode);
}

/**
 * 表单值类型
 */
export type FormValues = Record<string, any>;

/**
 * Form.List 独有的属性
 */
export interface FormListUniqueProps {
  /** 是否显示新增按钮，默认 true */
  showAddButton?: boolean;
  /** 是否显示删除按钮，默认 true */
  showRemoveButton?: boolean;
  /** 新增按钮的文本，默认 '添加' */
  addButtonText?: string;
  /** 删除按钮的文本，默认 '删除' */
  removeButtonText?: string;
  /** 表单配置项 */
  options: (field: FormListFieldData, index: number) => FormOption[];
  /** 点击新增按钮时的默认值 */
  addDefaultValue?: FormValues;
  /** 点击新增按钮时插入的索引位置 */
  addInsertIndex?: number;
}

/**
 * 表单配置项
 */
export interface FormOption {
  /** React 需要的 key，如果传递了唯一的 name，则不需要 */
  key?: string;
  /** 表单项字段名 */
  name?: string | string[];
  /** 表单项标签 */
  label?: ReactNode;
  /** 渲染类型 */
  render?: FormItemRenderType;
  /** 占据栅格列数，默认 12 */
  span?: number | string;
  /** 是否必填，默认 true，支持函数动态计算 */
  required?: boolean | ((formValues: FormValues) => boolean);
  /** 验证规则 */
  rules?: Rule | Rule[];
  /** 是否使用字符验证限制 */
  useConstraints?: boolean;
  /** 占位符文本，默认会根据传入的 render 类型自动判断（请选择、请输入）和 label 组合 */
  placeholder?: ReactNode;
  /** 提示信息，传入将在 label 右侧生成图标展示 tooltip */
  tip?: ReactNode;
  /** 是否隐藏，默认 false，支持函数动态计算 */
  hidden?: boolean | ((formValues: FormValues) => boolean);
  /** 是否自定义渲染，完全交给外部控制渲染，默认 false */
  customizeRender?: boolean;
  /** 选项数据（用于 select、radio、checkbox） */
  items?: OptionItem[];
  /** 字段键配置 */
  itemsField?: itemsFieldConfig;
  /** 传递给表单控件的属性，支持函数动态计算 */
  componentProps?: Record<string, any> | ((formValues: FormValues) => Record<string, any>);
  /** 传递给 Form.Item 的属性，支持函数动态计算 */
  formItemProps?: FormItemProps | ((formValues: FormValues) => FormItemProps);
  /** label 栅格配置，默认直接使用外层的 labelCol，如果 span 等于 24，是外层的 labelCol.span 一半 */
  labelCol?: ColProps;
  /** wrapper 栅格配置，默认为 24 - labelCol.span */
  wrapperCol?: ColProps;
  /** 是否应该更新（用于表单联动） */
  shouldUpdate?: boolean | ((prevValues: FormValues, nextValues: FormValues, info: { source?: string }) => boolean);
  /** 依赖字段（用于表单联动） */
  dependencies?: NamePath[];
  /** 是否仅用于保存标签，不渲染到页面上，只在表单中保存数据，默认 false */
  onlyForLabel?: boolean;
  /** Form.List 独有的属性 */
  formListUniqueProps?: FormListUniqueProps;
}

/**
 * FormItemsRenderer 组件属性
 */
export interface FormItemsRendererProps {
  /** 表单配置项数组 */
  options: FormOption[];
  /** 默认栅格占据列数，默认 12 */
  span?: number;
  /** 是否折叠（仅显示前3项），默认 false */
  collapse?: boolean;
  /** 自动生成必填规则，默认 true */
  useAutoGenerateRequired?: boolean;
  /** 初始值，用于在表单未初始化时提供默认值 */
  initialValues?: FormValues;
  /** 栅格间距，继承自 FormBuilder */
  gutter?: Gutter | [Gutter, Gutter];
  /** label 栅格配置，继承自 FormBuilder */
  labelCol?: ColProps;
}

/**
 * 表单项渲染器组件
 */
declare const FormItemsRenderer: FC<FormItemsRendererProps>;

export default FormItemsRenderer;
