import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose";
var _excluded = ["type", "onRestore", "auto", "refInput", "value", "width", "size", "mask", "maskChar", "formatChars", "alwaysShowMask", "signed", "integerDigits", "fractionDigits", "hideTrailingZeros", "buttonAriaLabel", "corners"];
var _class, _FxInput;
import React from 'react';
import warning from 'warning';
import { Group } from "../../Group";
import { Input } from "../../Input";
import { CurrencyInput } from "../../CurrencyInput";
import { createPropsGetter } from "../../../lib/createPropsGetter";
import { CommonWrapper } from "../../../internal/CommonWrapper";
import { rootNode } from "../../../lib/rootNode";
import { ThemeContext } from "../../../lib/theming/ThemeContext";
import { MaskedInput } from "../../MaskedInput";
import { getFullReactUIFlagsContext } from "../../../lib/featureFlagsContext";
import { ReactUIFeatureFlagsContext } from "../../../lib/featureFlagsContext/ReactUIFeatureFlagsContext";
import { withSize } from "../../../lib/size/SizeDecorator";
import { MathFunctionIcon } from "../MathFunctionIcon";
import { FxInputRestoreBtn } from "../FxInputRestoreBtn";
export var FxInputDataTids = {
  root: 'FxInput__root'
};

/** В автополе можно вывести автоматически рассчитанное цифровое значение. В него можно передавать итог любого вычисления, например, сумму других полей, процент или более сложную функцию.
 *
 * У поля есть иконка математической формулы и кнопка Restore — с её помощью пользователь может вернуть исходное значение, если редактировал поле. Видимость кнопки и поведение при нажатии нужно прописывать в компоненте самостоятельно.
 */
export var FxInput = rootNode(_class = withSize(_class = (_FxInput = /*#__PURE__*/function (_React$Component) {
  function FxInput() {
    var _this;
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
    _this.input = null;
    _this.getProps = createPropsGetter(FxInput.defaultProps);
    _this.renderMain = function (props) {
      var button = props.auto ? null : /*#__PURE__*/
      React.createElement(FxInputRestoreBtn, {
        size: props.size,
        onRestore: props.onRestore,
        corners: props.corners,
        disabled: props.disabled,
        borderless: props.borderless,
        "aria-label": props.buttonAriaLabel
      });
      return /*#__PURE__*/(
        React.createElement(Group, {
          "data-tid": FxInputDataTids.root,
          width: props.width
        }, button, _this.getInput(props))
      );
    };

    /** Программно устанавливает фокус на поле.
     * Появляется фокусная рамка, элемент получает клавиатурные события и воспринимается как текущий элемент для чтения скринридерами.
     * @public
     */
    _this.focus = function () {
      if (_this.input) {
        _this.input.focus();
      }
    };

    /** Программно снимает фокус с кнопки.
     * @public
     */
    _this.blur = function () {
      if (_this.input) {
        _this.input.blur();
      }
    };
    _this.refInput = function (element) {
      _this.input = element;
      if (_this.props.refInput) {
        _this.props.refInput(_this.input);
      }
    };
    _this.getLeftIcon = function (props) {
      if (!props.auto) {
        return null;
      }
      var iconSizes = {
        small: parseInt(_this.theme.inputIconSizeSmall),
        medium: parseInt(_this.theme.inputIconSizeMedium),
        large: parseInt(_this.theme.inputIconSizeLarge)
      };
      var size = _this.size;
      return /*#__PURE__*/React.createElement(MathFunctionIcon, {
        size: iconSizes[size]
      });
    };
    _this.getInput = function (props) {
      var type = props.type,
        onRestore = props.onRestore,
        auto = props.auto,
        refInput = props.refInput,
        value = props.value,
        width = props.width,
        _size = props.size,
        mask = props.mask,
        maskChar = props.maskChar,
        formatChars = props.formatChars,
        alwaysShowMask = props.alwaysShowMask,
        signed = props.signed,
        integerDigits = props.integerDigits,
        fractionDigits = props.fractionDigits,
        hideTrailingZeros = props.hideTrailingZeros,
        buttonAriaLabel = props.buttonAriaLabel,
        originalCorners = props.corners,
        rest = _objectWithoutPropertiesLoose(props, _excluded);
      var corners = auto ? originalCorners : _extends({
        borderBottomLeftRadius: 0,
        borderTopLeftRadius: 0
      }, originalCorners);
      var size = _this.size;
      var commonInputProps = _extends({
        corners: corners,
        size: size,
        width: '100%',
        ref: _this.refInput
      }, rest);
      if (type === 'currency') {
        return /*#__PURE__*/(
          React.createElement(CurrencyInput, _extends({}, commonInputProps, {
            signed: signed,
            integerDigits: integerDigits,
            fractionDigits: fractionDigits,
            value: value,
            onValueChange: _this.props.onValueChange
          }))
        );
      }
      if (_this.featureFlags.fxInputUseMaskedInput && mask) {
        return /*#__PURE__*/(
          React.createElement(MaskedInput, _extends({}, commonInputProps, {
            leftIcon: _this.getLeftIcon(props),
            align: "right",
            mask: mask,
            maskChar: maskChar,
            formatChars: formatChars,
            alwaysShowMask: alwaysShowMask,
            value: value,
            onValueChange: _this.props.onValueChange
          }))
        );
      }
      return /*#__PURE__*/(
        React.createElement(Input, _extends({}, commonInputProps, {
          leftIcon: _this.getLeftIcon(props),
          align: "right",
          mask: mask,
          maskChar: maskChar,
          formatChars: formatChars,
          alwaysShowMask: alwaysShowMask,
          type: type,
          value: value,
          onValueChange: _this.props.onValueChange
        }))
      );
    };
    return _this;
  }
  _inheritsLoose(FxInput, _React$Component);
  var _proto = FxInput.prototype;
  _proto.validateProps = function validateProps(props) {
    warning(props.type !== 'currency' && props.mask !== undefined, '[FxInput]: Prop "mask" is not supported when type="currency"');
  };
  _proto.componentDidMount = function componentDidMount() {
    this.validateProps(this.getProps());
  };
  _proto.componentDidUpdate = function componentDidUpdate() {
    this.validateProps(this.getProps());
  };
  _proto.render = function render() {
    var _this2 = this;
    return /*#__PURE__*/React.createElement(ReactUIFeatureFlagsContext.Consumer, null, function (flags) {
      _this2.featureFlags = getFullReactUIFlagsContext(flags);
      return /*#__PURE__*/React.createElement(ThemeContext.Consumer, null, function (theme) {
        _this2.theme = theme;
        return /*#__PURE__*/React.createElement(CommonWrapper, _extends({
          rootNodeRef: _this2.setRootNode
        }, _this2.getProps()), _this2.renderMain);
      });
    });
  };
  return FxInput;
}(React.Component), _FxInput.__KONTUR_REACT_UI__ = 'FxInput', _FxInput.displayName = 'FxInput', _FxInput.defaultProps = {
  width: 250,
  type: 'text',
  value: '',
  auto: false
}, _FxInput)) || _class) || _class;