"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Multiple = void 0;
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _nativeProps = require("../../utils/native-props");
var _tree = require("../../utils/tree");
var _withDefaultProps = require("../../utils/with-default-props");
var _checkbox = _interopRequireDefault(require("../checkbox"));
var _usePropsValue = require("../../utils/use-props-value");
var _devLog = require("../../utils/dev-log");
var _hooks = require("../../hooks");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const classPrefix = `adm-tree-select-multiple`;
const Multiple = p => {
  const props = (0, _withDefaultProps.mergeProps)({
    options: [],
    fieldNames: {},
    allSelectText: [],
    defaultExpandKeys: [],
    defaultValue: []
  }, p);
  (0, _react.useEffect)(() => {
    (0, _devLog.devWarning)('TreeSelect', 'TreeSelect.Multiple has been deprecated.');
  }, []);
  const [labelName, valueName, childrenName] = (0, _hooks.useFieldNames)(props.fieldNames);
  // 打开的 keys
  const [expandKeys, setExpandKeys] = (0, _usePropsValue.usePropsValue)({
    value: props.expandKeys,
    defaultValue: props.defaultExpandKeys
  });
  // 选中的 value（聚合后）
  const [value, setValue] = (0, _usePropsValue.usePropsValue)({
    value: props.value,
    defaultValue: props.defaultValue
  });
  // 获取目标所有叶子节点 key 集合
  const getLeafKeys = option => {
    const keys = [];
    const walker = op => {
      var _a;
      if (!op) {
        return;
      }
      if ((_a = op[childrenName]) === null || _a === void 0 ? void 0 : _a.length) {
        op[childrenName].forEach(i => walker(i));
      } else {
        keys.push(op[valueName]);
      }
    };
    walker(option);
    return keys;
  };
  const [deep, optionsMap, optionsParentMap] = (0, _react.useMemo)(() => {
    const deep = (0, _tree.getTreeDeep)(props.options, childrenName);
    const optionsMap = new Map();
    const optionsParentMap = new Map();
    function traverse(current, children) {
      children.forEach(item => {
        optionsParentMap.set(item[valueName], current);
        optionsMap.set(item[valueName], item);
        if (item[childrenName]) {
          traverse(item, item[childrenName]);
        }
      });
    }
    traverse(undefined, props.options);
    return [deep, optionsMap, optionsParentMap];
  }, [props.options]);
  // 将聚合的 value 拆分开，获得叶子节点的 value 集合
  const allSelectedLeafKeys = (0, _react.useMemo)(() => {
    let leafKeys = [];
    value.forEach(v => {
      const option = optionsMap.get(v);
      leafKeys = leafKeys.concat(getLeafKeys(option));
    });
    return leafKeys;
  }, [value, optionsMap]);
  // 子级有被选中的节点集合
  const dotMap = (0, _react.useMemo)(() => {
    const map = new Map();
    // 遍历 allChildrenValues, 向上递归
    const walker = key => {
      const parentOption = optionsParentMap.get(key);
      if (!parentOption) {
        return;
      }
      map.set(parentOption[valueName], true);
      walker(parentOption[valueName]);
    };
    allSelectedLeafKeys.forEach(key => {
      map.set(key, true);
      walker(key);
    });
    return map;
  }, [optionsParentMap, value]);
  const onChange = targetKeys => {
    var _a;
    let groupKeys = [...targetKeys];
    let unusedKeys = [];
    const walker = keys => {
      keys.forEach(key => {
        var _a;
        if (unusedKeys.includes(key)) {
          return;
        }
        const parent = optionsParentMap.get(key);
        if (!parent) {
          return;
        }
        const childrenKeys = ((_a = parent[childrenName]) === null || _a === void 0 ? void 0 : _a.map(i => i[valueName])) || [];
        if (childrenKeys.every(i => groupKeys.includes(i))) {
          groupKeys.push(parent[valueName]);
          unusedKeys = unusedKeys.concat(childrenKeys);
        }
      });
    };
    // 遍历 deep 次 groupKeys，每次往上聚合一层
    for (let i = 0; i < deep; i++) {
      walker(groupKeys);
    }
    groupKeys = groupKeys.filter(i => !unusedKeys.includes(i));
    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
    const groupOptions = groupKeys.map(i => optionsMap.get(i));
    setValue(groupKeys);
    (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, groupKeys, groupOptions);
  };
  const onItemSelect = option => {
    var _a;
    const parentNodes = [];
    let current = option;
    while (current) {
      parentNodes.unshift(current);
      const next = optionsParentMap.get(current[valueName]);
      current = next;
    }
    const keys = parentNodes.map(i => i[valueName]);
    setExpandKeys(keys);
    (_a = props.onExpand) === null || _a === void 0 ? void 0 : _a.call(props, keys, parentNodes);
  };
  // 渲染全选节点
  const renderSelectAllItem = (columnOptions, index) => {
    var _a;
    const text = (_a = props.selectAllText) === null || _a === void 0 ? void 0 : _a[index];
    if (!text) {
      return;
    }
    let currentLeafKeys = [];
    columnOptions.forEach(option => {
      currentLeafKeys = currentLeafKeys.concat(getLeafKeys(option));
    });
    const allSelected = currentLeafKeys.every(i => allSelectedLeafKeys.includes(i));
    return _react.default.createElement("div", {
      onClick: () => {
        if (allSelected) {
          onChange(allSelectedLeafKeys.filter(i => !currentLeafKeys.includes(i)));
        } else {
          onChange(allSelectedLeafKeys.concat(currentLeafKeys));
        }
      },
      className: `${classPrefix}-item`
    }, text);
  };
  // 渲染
  const renderSelectAllLeafItem = (columnOptions, index) => {
    var _a;
    const text = (_a = props.selectAllText) === null || _a === void 0 ? void 0 : _a[index];
    if (!text) {
      return;
    }
    const currentLeafKeys = columnOptions.map(i => i[valueName]);
    const allSelected = currentLeafKeys.every(i => allSelectedLeafKeys.includes(i));
    const halfSelected = allSelected ? false : currentLeafKeys.some(i => allSelectedLeafKeys.includes(i));
    return _react.default.createElement("div", {
      onClick: () => {
        if (allSelected) {
          onChange(allSelectedLeafKeys.filter(i => !currentLeafKeys.includes(i)));
        } else {
          onChange(allSelectedLeafKeys.concat(currentLeafKeys));
        }
      },
      className: (0, _classnames.default)(`${classPrefix}-item`, `${classPrefix}-item-leaf`)
    }, _react.default.createElement(_checkbox.default, {
      className: `${classPrefix}-item-checkbox`,
      checked: allSelected,
      indeterminate: halfSelected
    }), text);
  };
  // 渲染节点
  const renderItem = option => {
    const isExpand = expandKeys.includes(option[valueName]);
    return _react.default.createElement("div", {
      key: option[valueName],
      onClick: () => {
        if (!isExpand) {
          onItemSelect(option);
        }
      },
      className: (0, _classnames.default)(`${classPrefix}-item`, {
        [`${classPrefix}-item-expand`]: isExpand
      })
    }, option[labelName], !!dotMap.get(option[valueName]) && _react.default.createElement("div", {
      className: `${classPrefix}-dot`
    }));
  };
  // 渲染叶子节点
  const renderLeafItem = option => {
    const isSelected = allSelectedLeafKeys.includes(option[valueName]);
    return _react.default.createElement("div", {
      key: option[valueName],
      onClick: () => {
        if (isSelected) {
          onChange(allSelectedLeafKeys.filter(val => val !== option[valueName]));
        } else {
          onChange([...allSelectedLeafKeys, option[valueName]]);
        }
      },
      className: (0, _classnames.default)(`${classPrefix}-item`, `${classPrefix}-item-leaf`)
    }, _react.default.createElement(_checkbox.default, {
      className: `${classPrefix}-item-checkbox`,
      checked: isSelected
    }), option[labelName]);
  };
  const renderItems = (columnOptions = [], index) => {
    if (columnOptions.length === 0) {
      return;
    }
    const isLeaf = deep === index + 1;
    if (isLeaf) {
      return _react.default.createElement(_react.default.Fragment, null, renderSelectAllLeafItem(columnOptions, index), columnOptions.map(option => renderLeafItem(option)));
    }
    return _react.default.createElement(_react.default.Fragment, null, renderSelectAllItem(columnOptions, index), columnOptions.map(option => renderItem(option)));
  };
  const renderColumns = () => {
    var _a;
    const columns = [];
    for (let i = 0; i < deep; i++) {
      let width = `${100 / deep}%`;
      // 两列的第一列宽度为 33.33，两列的第二列为 66.67%
      if (deep === 2 && i === 0) {
        width = `33.33%`;
      }
      if (deep === 2 && i === 1) {
        width = `66.67%`;
      }
      const column = _react.default.createElement("div", {
        key: i,
        className: (0, _classnames.default)(`${classPrefix}-column`),
        style: {
          width
        }
      }, renderItems(i === 0 ? props.options : (_a = optionsMap.get(expandKeys[i - 1])) === null || _a === void 0 ? void 0 : _a[childrenName], i));
      columns.push(column);
    }
    return columns;
  };
  return (0, _nativeProps.withNativeProps)(props, _react.default.createElement("div", {
    className: classPrefix
  }, renderColumns()));
};
exports.Multiple = Multiple;