import React, { useEffect, useContext } from 'react';
import classnames from 'classnames';
import { noteOnce } from 'rc-util/es/warning';
import SizeContext from 'antd/es/config-provider/SizeContext';
import Form from '../form';
import { pickProFormItemProps } from '../utils';
import FieldContext from './field-context';
import LightWrapper from './light-wrapper';
import { jsx as _jsx } from "react/jsx-runtime";
const WIDTH_SIZE_ENUM = {
  // 适用于短数字，短文本或者选项
  xs: 104,
  s: 216,
  // 适用于较短字段录入、如姓名、电话、ID 等。
  sm: 216,
  m: 328,
  // 标准宽度，适用于大部分字段长度。
  md: 328,
  l: 440,
  // 适用于较长字段录入，如长网址、标签组、文件路径等。
  lg: 440,
  // 适用于长文本录入，如长链接、描述、备注等，通常搭配自适应多行输入框或定高文本域使用。
  xl: 552
};

// 给控件扩展的通用的属性

/**
 * 这个方法的主要作用的帮助 Field 增加 FormItem 同时也会处理 lightFilter
 *
 * @param Field
 * @param config
 */
function createField(Field, config) {
  const FieldWithContext = props => {
    var _rest$fieldProps;
    const size = useContext(SizeContext);
    const {
      label,
      tooltip,
      placeholder,
      width,
      proFieldProps,
      bordered,
      messageVariables,
      ignoreFormItem,
      transform,
      readonly,
      allowClear,
      // eslint-disable-next-line
      colSize,
      formItemProps: propsFormItemProps,
      ...rest
    } = props;
    const {
      valueType,
      customLightMode,
      lightFilterLabelFormatter,
      valuePropName = 'value',
      ...defaultFormItemProps
    } = config || {};
    /** 从 context 中拿到的值 */
    const {
      fieldProps,
      formItemProps,
      setFieldValueType
    } = React.useContext(FieldContext);
    useEffect(() => {
      // 如果 setFieldValueType 和 props.name 不存在不存入
      if (!setFieldValueType || !props.name) {
        return;
      }
      // Field.type === 'ProField' 时 props 里面是有 valueType 的，所以要设置一下
      // 写一个 ts 比较麻烦，用 any 顶一下
      setFieldValueType(props.name, {
        valueType: valueType || rest.valueType || 'text',
        transform
      });
    }, [props.name, transform, valueType]);

    // restFormItemProps is user props pass to Form.Item
    const restFormItemProps = pickProFormItemProps(rest);
    const formNeedProps = {
      value: rest.value,
      onChange: rest.onChange
    };
    const realFieldProps = {
      ...(ignoreFormItem ? formNeedProps : {}),
      disabled: props.disabled,
      // 轻量筛选模式下默认不显示 FormItem 的 label，label 设置为 placeholder
      placeholder: proFieldProps !== null && proFieldProps !== void 0 && proFieldProps.light ? placeholder || label : placeholder,
      ...(fieldProps || {}),
      ...(rest.fieldProps || {}),
      style: {
        // 有些组件是不需要自带的 width
        ...((_rest$fieldProps = rest.fieldProps) === null || _rest$fieldProps === void 0 ? void 0 : _rest$fieldProps.style),
        ...(fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style)
      }
    };
    const otherProps = {
      messageVariables,
      ...defaultFormItemProps,
      ...formItemProps,
      ...restFormItemProps,
      ...propsFormItemProps
    };
    noteOnce(
    // eslint-disable-next-line
    // @ts-expect-error
    !rest.defaultValue, '请不要在 Form 中使用 defaultXXX。如果需要默认值请使用 initialValues 和 initialValue。');
    const field = /*#__PURE__*/_jsx(Field
    // ProXxx 上面的 props 透传给 FieldProps，可能包含 Field 自定义的 props，
    // 比如 ProFormSelect 的 request
    , {
      ...rest,
      fieldProps: {
        allowClear,
        ...realFieldProps,
        style: {
          width: typeof width === 'number' ? width : undefined,
          ...(realFieldProps === null || realFieldProps === void 0 ? void 0 : realFieldProps.style)
        },
        className: classnames(realFieldProps === null || realFieldProps === void 0 ? void 0 : realFieldProps.className, {
          [`pro-field-${width}`]: width && WIDTH_SIZE_ENUM[width]
        })
      },
      proFieldProps: {
        mode: readonly ? 'read' : 'edit',
        params: rest.params,
        proFieldKey: otherProps === null || otherProps === void 0 ? void 0 : otherProps.name,
        ...proFieldProps
      }
    });

    /** 被放到 FormSet 的时候 */
    if (ignoreFormItem) {
      return field;
    }
    return /*#__PURE__*/_jsx(Form.Item, {
      // 全局的提供一个 tip 功能，可以减少代码量
      // 轻量模式下不通过 FormItem 显示 label
      label: label && (proFieldProps === null || proFieldProps === void 0 ? void 0 : proFieldProps.light) !== true ? label : undefined,
      tooltip: (proFieldProps === null || proFieldProps === void 0 ? void 0 : proFieldProps.light) !== true && tooltip,
      valuePropName: valuePropName,
      ...otherProps,
      messageVariables: {
        label: label,
        ...(otherProps === null || otherProps === void 0 ? void 0 : otherProps.messageVariables)
      },
      children: /*#__PURE__*/_jsx(LightWrapper, {
        ...realFieldProps,
        allowClear: allowClear,
        bordered: bordered,
        size: size,
        light: proFieldProps === null || proFieldProps === void 0 ? void 0 : proFieldProps.light,
        customLightMode: customLightMode,
        label: label,
        labelFormatter: lightFilterLabelFormatter,
        valuePropName: valuePropName,
        children: field
      })
    });
  };
  return FieldWithContext;
}
export default createField;