import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import * as React from 'react';
import classNames from 'classnames';
import omit from '../components/rc-util/omit';
import Checkbox from './checkbox';
import Grid from '../grid';
import { ConfigContext } from '../config-provider/context';
var Row = Grid.Row,
    Col = Grid.Col;
export var GroupContext = /*#__PURE__*/React.createContext(null);
export var CheckboxGroup = function CheckboxGroup(_ref) {
  var defaultValue = _ref.defaultValue,
      children = _ref.children,
      _ref$options = _ref.options,
      options = _ref$options === void 0 ? [] : _ref$options,
      customizePrefixCls = _ref.prefixCls,
      className = _ref.className,
      style = _ref.style,
      onChange = _ref.onChange,
      rowProps = _ref.rowProps,
      colProps = _ref.colProps,
      direction = _ref.direction,
      restProps = _objectWithoutProperties(_ref, ["defaultValue", "children", "options", "prefixCls", "className", "style", "onChange", "rowProps", "colProps", "direction"]);

  var _React$useContext = React.useContext(ConfigContext),
      getPrefixClassName = _React$useContext.getPrefixClassName;

  var RestChildren = children;

  var _React$useState = React.useState(restProps.value || defaultValue || []),
      _React$useState2 = _slicedToArray(_React$useState, 2),
      value = _React$useState2[0],
      setValue = _React$useState2[1];

  var _React$useState3 = React.useState([]),
      _React$useState4 = _slicedToArray(_React$useState3, 2),
      registeredValues = _React$useState4[0],
      setRegisteredValues = _React$useState4[1];

  React.useEffect(function () {
    if ('value' in restProps) {
      setValue(restProps.value || []);
    }
  }, [restProps.value]);

  var getOptions = function getOptions() {
    return options.map(function (option) {
      if (typeof option === 'string') {
        return {
          label: option,
          value: option
        };
      }

      return option;
    });
  };

  var cancelValue = function cancelValue(val) {
    setRegisteredValues(function (prevValues) {
      return prevValues.filter(function (v) {
        return v !== val;
      });
    });
  };

  var registerValue = function registerValue(val) {
    setRegisteredValues(function (prevValues) {
      return [].concat(_toConsumableArray(prevValues), [val]);
    });
  };

  var toggleOption = function toggleOption(option) {
    var optionIndex = value.indexOf(option.value);

    var newValue = _toConsumableArray(value);

    if (optionIndex === -1) {
      newValue.push(option.value);
    } else {
      newValue.splice(optionIndex, 1);
    }

    if (!('value' in restProps)) {
      setValue(newValue);
    }

    if (onChange) {
      var opts = getOptions();
      onChange(newValue.filter(function (val) {
        return registeredValues.indexOf(val) !== -1;
      }).sort(function (a, b) {
        var indexA = opts.findIndex(function (opt) {
          return opt.value === a;
        });
        var indexB = opts.findIndex(function (opt) {
          return opt.value === b;
        });
        return indexA - indexB;
      }));
    }
  };

  var prefixCls = getPrefixClassName('checkbox', customizePrefixCls);
  var groupPrefixCls = "".concat(prefixCls, "-group");
  var domProps = omit(restProps, ['value', 'disabled']);

  if (options && options.length > 0) {
    RestChildren = getOptions().map(function (option, index) {
      return /*#__PURE__*/React.createElement(Checkbox, {
        prefixCls: prefixCls,
        key: option.value.toString(),
        disabled: 'disabled' in option ? option.disabled : restProps.disabled,
        value: option.value,
        checked: value.indexOf(option.value) !== -1,
        onChange: option.onChange,
        className: "".concat(groupPrefixCls, "-item"),
        style: option.style
      }, option.label);
    });
  }

  var context = {
    toggleOption: toggleOption,
    value: value,
    disabled: restProps.disabled,
    name: restProps.name,
    registerValue: registerValue,
    cancelValue: cancelValue
  };
  var classString = classNames(groupPrefixCls, className);
  var rowCls = classNames(rowProps === null || rowProps === void 0 ? void 0 : rowProps.className, _defineProperty({}, "".concat(groupPrefixCls, "-row-vertical"), direction === 'vertical'));
  var rowGutter = direction === 'vertical' ? [0, 20] : [32];
  return /*#__PURE__*/React.createElement("div", Object.assign({
    className: classString,
    style: style
  }, domProps), /*#__PURE__*/React.createElement(GroupContext.Provider, {
    value: context
  }, /*#__PURE__*/React.createElement(Row, Object.assign({
    gutter: rowGutter,
    className: rowCls
  }, rowProps), React.Children.map(RestChildren, function (item, index) {
    return (
      /* eslint-disable react/no-array-index-key */
      item ? /*#__PURE__*/React.createElement(Col, Object.assign({
        key: index
      }, colProps), item) : null
    );
  }))));
};
export default /*#__PURE__*/React.memo(CheckboxGroup);