"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

var _typeof = require("@babel/runtime/helpers/typeof");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.FormDish = FormDish;
exports.default = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));

var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));

var _react = _interopRequireWildcard(require("react"));

var _lodash = _interopRequireDefault(require("lodash"));

var _excluded = ["field", "privateProps", "publicProps", "fieldStyleCategory"],
    _excluded2 = ["readOnly"],
    _excluded3 = ["readOnly"];

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

function HocFormDish(WrapperComponent) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  var _options$fieldMaps = options.fieldMaps,
      fieldMaps = _options$fieldMaps === void 0 ? {} : _options$fieldMaps,
      _options$specialField = options.specialFields,
      specialFields = _options$specialField === void 0 ? [] : _options$specialField,
      _options$complexField = options.complexFields,
      complexFields = _options$complexField === void 0 ? [] : _options$complexField;
  return function InnerFormDish(props) {
    var _props$field = props.field,
        _props$field$property = _props$field.property,
        property = _props$field$property === void 0 ? {} : _props$field$property,
        identifier = _props$field.identifier,
        _props$privateProps = props.privateProps,
        privateProps = _props$privateProps === void 0 ? {} : _props$privateProps,
        _props$publicProps = props.publicProps,
        publicProps = _props$publicProps === void 0 ? {} : _props$publicProps,
        fieldStyleCategory = props.fieldStyleCategory,
        restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
    var isFieldHide = (0, _react.useMemo)(function () {
      var result = false;

      if (identifier in privateProps && 'isFieldHide' in privateProps[identifier]) {
        result = privateProps[identifier].isFieldHide;
      } else {
        result = property && property.isFieldHide;
      }

      return result;
    }, [property, privateProps, identifier]);
    var formatProps = (0, _react.useMemo)(function () {
      var _ref = privateProps[identifier] || {},
          logicReadOnly = _ref.readOnly,
          restPrivateProps = (0, _objectWithoutProperties2.default)(_ref, _excluded2);

      var readOnly = publicProps.readOnly,
          restPublicProps = (0, _objectWithoutProperties2.default)(publicProps, _excluded3);
      var isFieldReadOnly = property.isFieldReadOnly;

      var _readOnly;

      if (typeof logicReadOnly === 'boolean') {
        _readOnly = logicReadOnly;
      } else {
        _readOnly = readOnly || isFieldReadOnly;
      }

      var extendRestProps = _lodash.default.pickBy(restProps, function (v, k) {
        return !['FormBuild', 'form', 'field', 'fieldMapsPlus', 'validateRule'].includes(k);
      });

      var extraProps = _objectSpread(_objectSpread(_objectSpread({}, restPublicProps), extendRestProps), {}, {
        fieldStyleCategory: fieldStyleCategory
      }, restPrivateProps || {});

      return {
        extraProps: extraProps,
        readOnly: _readOnly
      };
    }, [identifier, property, privateProps, restProps, fieldStyleCategory, publicProps]);
    var fieldProps = (0, _react.useMemo)(function () {
      // 若需要 field 中的 type, identifier 等作为props，可在此返回
      return _lodash.default.pick(props.field, ['identifier', 'type', 'detailTableFields', 'formCode', 'cascadeDataRelations', 'fieldCode']);
    }, [props.field]);
    var fieldType = (0, _react.useMemo)(function () {
      var _props$field2 = props.field,
          type = _props$field2.type,
          property = _props$field2.property;
      return type === 'SharedFieldRefInput' ? property.reference.type : type;
    }, [props.field]);
    var fieldValue = props.form.getFieldValue(props.field.identifier);
    var errMsg = props.form.getFieldError(props.field.identifier);
    var Field = (0, _react.useMemo)(function () {
      var property = props.field.property;
      var orgField = fieldMaps[fieldType];
      var matcheField = null;

      if (orgField) {
        if (['CityInput', 'DateTimeInput'].includes(fieldType)) {
          matcheField = orgField[property.selectionModule || 'SINGLE'];
        } else if (['OptionInput'].includes(fieldType)) {
          matcheField = orgField[property.sourceMode];
        } else if (['ApplicationDetailListInput'].includes(fieldType)) {
          matcheField = orgField[property.inputMode];
        } else if (['CollectionAccountInput', 'AccountInput'].includes(fieldType)) {
          matcheField = orgField[property.accountFrom || 'INTERNAL'];
        } else {
          matcheField = orgField;
        }
      } else {
        console.log("\u274C the field ".concat(fieldType, " does not has mapped target"));
      }

      return matcheField;
    }, [props.field, fieldType]);
    var fieldNode = (0, _react.useMemo)(function () {
      var _props$form = props.form,
          getFieldDecorator = _props$form.getFieldDecorator,
          getFieldValue = _props$form.getFieldValue,
          setWatch = _props$form.setWatch,
          getFormFieldByName = _props$form.getFormFieldByName;
      var _props$field3 = props.field,
          identifier = _props$field3.identifier,
          property = _props$field3.property;
      var fieldForm = {
        getFieldValue: getFieldValue,
        setWatch: setWatch,
        getFormFieldByName: getFormFieldByName
      };
      var node = getFieldDecorator(identifier, props.validateRule)( /*#__PURE__*/_react.default.createElement("div", {
        className: "formchef-field-wrapper"
      }), /*#__PURE__*/_react.default.createElement(Field, {
        fieldProperties: property,
        fieldProps: fieldProps,
        extraProps: formatProps.extraProps,
        fieldForm: fieldForm,
        readOnly: formatProps.readOnly
      }));
      return node; // eslint-disable-next-line react-hooks/exhaustive-deps        
    }, [Field, fieldProps, props.form, props.field, props.validateRule, fieldValue, formatProps]);

    if (isFieldHide) {
      return null;
    } else if (Field) {
      return /*#__PURE__*/_react.default.createElement(WrapperComponent, {
        field: props.field,
        form: props.form,
        isInTable: props.isInTable,
        isInSecondaryForm: props.isInSecondaryForm,
        specialFields: specialFields,
        complexFields: complexFields,
        value: fieldValue,
        formatProps: formatProps,
        errMsg: errMsg
      }, fieldNode || /*#__PURE__*/_react.default.createElement("span", null));
    } else {
      return null;
    }
  };
}
/**
 * @author 卫蓉
 */


function FormDish() {
  return /*#__PURE__*/_react.default.createElement("div", null);
}

var _default = HocFormDish;
exports.default = _default;