import { InfoCircleOutlined } from "@ant-design/icons";
import {
  Checkbox,
  Col,
  DatePicker,
  Divider,
  Form,
  Input,
  InputNumber,
  Radio,
  Select,
  Tooltip,
} from "antd";
import dayjs from "dayjs";
import { FORM_ITEM_RENDER_ENUM } from "../../enum/formItemRender";
const { TextArea } = Input;
const { RangePicker } = DatePicker;
/**
 * 表单项渲染器组件
 */
const FormItemsRenderer = ({
  options,
  span = 12,
  collapse = false,
  useAutoGenerateRequired = true,
}) => {
  const form = Form.useFormInstance();
  // 获取传给组件的属性
  const getComponentProps = (option) => {
    return typeof option.componentProps === "function"
      ? option.componentProps(form.getFieldsValue())
      : (option.componentProps || {});
  };
  // 获取传给formItem的属性
  const getFormItemProps = (option) => {
    const formItemProps = typeof option.formItemProps === "function"
      ? option.formItemProps(form.getFieldsValue())
      : (option.formItemProps || {});
    // 为日期组件添加特殊处理
    if ([
      FORM_ITEM_RENDER_ENUM.DATE,
      FORM_ITEM_RENDER_ENUM.DATE_MONTH,
      FORM_ITEM_RENDER_ENUM.DATE_YEAR,
      FORM_ITEM_RENDER_ENUM.DATETIME,
    ].includes(option.render)) {
      formItemProps.getValueFromEvent = (_, dateString) => dateString;
      formItemProps.getValueProps = value => ({ value: value ? dayjs(value) : undefined });
    }
    // 为日期周组件添加特殊处理
    if ([
      FORM_ITEM_RENDER_ENUM.DATE_WEEK,
    ].includes(option.render)) {
      formItemProps.getValueFromEvent = (_, dateString) => dateString;
      formItemProps.getValueProps = value => ({ value: value ? dayjs(value, "YYYY-wo") : undefined });
    }
    // 为日期范围组件添加特殊处理
    if ([
      FORM_ITEM_RENDER_ENUM.DATE_RANGE,
      FORM_ITEM_RENDER_ENUM.DATETIME_RANGE,
    ].includes(option.render)) {
      formItemProps.getValueFromEvent = (_, dateString) => dateString;
      formItemProps.getValueProps = value => ({ value: Array.isArray(value) ? value.map(v => v ? dayjs(v) : undefined) : undefined });
    }
    return formItemProps;
  };
  // 获取items里的value和label字段key
  const getItemsFieldKey = (option) => {
    return {
      valueKey: option?.itemsField?.valueKey || "id",
      labelKey: option?.itemsField?.labelKey || "name",
    };
  };
  // 获取验证规则
  const getRules = (option) => {
    if (!useAutoGenerateRequired)
      return option.rules ? (Array.isArray(option.rules) ? option.rules : [option.rules]) : [];
    if (option.render === FORM_ITEM_RENDER_ENUM.DIVIDER)
      return [];
    // 支持动态计算 required
    const required = typeof option.required === "function"
      ? option.required(form.getFieldsValue())
      : (option.required ?? true);
    if (required) {
      const isBlurTrigger = !option.render || [
        FORM_ITEM_RENDER_ENUM.INPUT,
        FORM_ITEM_RENDER_ENUM.TEXTAREA,
        FORM_ITEM_RENDER_ENUM.INPUT_NUMBER,
        FORM_ITEM_RENDER_ENUM.NUMBER,
      ].includes(option.render);
      const rules = [
        {
          required: true,
          message: `${isBlurTrigger ? "请输入" : "请选择"}${option.label}`,
        },
      ];
      if (option.rules) {
        if (Array.isArray(option.rules)) {
          rules.push(...option.rules);
        }
        else {
          rules.push(option.rules);
        }
      }
      return rules;
    }
    return option.rules ? (Array.isArray(option.rules) ? option.rules : [option.rules]) : [];
  };
  // 渲染表单控件
  const renderFormControl = (option) => {
    const componentProps = getComponentProps(option);
    const itemsFieldKey = getItemsFieldKey(option);
    /** @type {string | Function} */
    const render = option.render || FORM_ITEM_RENDER_ENUM.INPUT;
    const placeholder = option.placeholder || `请${render === FORM_ITEM_RENDER_ENUM.SELECT || render === FORM_ITEM_RENDER_ENUM.RADIO || render === FORM_ITEM_RENDER_ENUM.CHECKBOX ? "选择" : "输入"}${option.label}`;
    switch (render) {
      case FORM_ITEM_RENDER_ENUM.INPUT:
        return ;
      case FORM_ITEM_RENDER_ENUM.TEXTAREA:
        return ;
      case FORM_ITEM_RENDER_ENUM.INPUT_NUMBER:
      case FORM_ITEM_RENDER_ENUM.NUMBER:
        return