function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
import { useState, useCallback } from 'react';
import { isNumber } from '@pisell/utils';

/**
 * 键盘输入处理 Hook
 * @param params 配置参数
 * @param params.onChange 值变化回调
 * @param params.onEnter 确认回调
 * @param params.onReset 重置回调
 * @param params.value 当前值
 * @param params.min 最小值限制
 * @param params.max 最大值限制
 * @param params.scale 小数位数限制
 * @param params.mode 输入模式：'append' 追加模式（默认）| 'replace' 替换模式
 */
var useKeyActions = function useKeyActions(params) {
  var _useState = useState(null),
    _useState2 = _slicedToArray(_useState, 2),
    error = _useState2[0],
    setError = _useState2[1];
  var onChange = params.onChange,
    onEnter = params.onEnter,
    onReset = params.onReset,
    _params$value = params.value,
    value = _params$value === void 0 ? '' : _params$value,
    min = params.min,
    max = params.max,
    _params$mode = params.mode,
    mode = _params$mode === void 0 ? 'append' : _params$mode,
    scale = params.scale;

  /**
   * 检查小数位数是否超出限制
   */
  var checkScale = useCallback(function (val) {
    if (scale === undefined) return true;
    var decimalIndex = val.indexOf('.');
    if (decimalIndex === -1) return true;
    var decimalPart = val.substring(decimalIndex + 1);
    return decimalPart.length <= scale;
  }, [scale]);

  /**
   * 数值范围校验
   */
  var validateRange = useCallback(function (val) {
    var trimmedVal = val.trim();
    var numVal = Number(trimmedVal);
    if (isNaN(numVal)) {
      var errorMsg = 'invalid';
      setError({
        msg: errorMsg
      });
      return {
        isValid: false,
        errorMsg: errorMsg
      };
    }
    if (min !== undefined && numVal < min) {
      var _errorMsg = 'invalid';
      setError({
        msg: _errorMsg
      });
      return {
        isValid: false,
        errorMsg: _errorMsg
      };
    }
    if (max !== undefined && numVal > max) {
      var _errorMsg2 = 'invalid';
      setError({
        msg: _errorMsg2
      });
      return {
        isValid: false,
        errorMsg: _errorMsg2
      };
    }
    setError(null);
    return {
      isValid: true
    };
  }, [min, max]);

  /**
   * 处理值变化
   */
  var handleChangeValue = useCallback(function (val) {
    // 检查小数位数限制
    if (!checkScale(val)) {
      return {
        isValid: false,
        errorMsg: 'decimal_places_exceeded'
      };
    }
    var validation = validateRange(val);
    if (validation.isValid) {
      onChange === null || onChange === void 0 || onChange(val);
    }
    return validation;
  }, [onChange, validateRange, checkScale]);

  /**
   * 处理数字输入（0-9）
   */
  var handleNumberInput = useCallback(function (inputVal) {
    var numStr = String(inputVal);

    // 替换模式：直接替换当前值
    if (mode === 'replace') {
      return handleChangeValue(numStr);
    }

    // 追加模式
    if (!value) {
      return handleChangeValue(numStr);
    }

    // 处理前导零的情况
    if (/^0+$/.test(value)) {
      // 当前值全是0，输入非0数字时替换，输入0时追加
      if (numStr === '0') {
        return handleChangeValue(value + '0');
      } else {
        return handleChangeValue(numStr);
      }
    }

    // 处理以0开头但包含小数点的情况（如 "0.123"）
    if (/^0\.\d*$/.test(value)) {
      return handleChangeValue(value + numStr);
    }

    // 处理以0开头的整数（如 "001", "0123"）
    if (/^0+\d+$/.test(value)) {
      // 去除前导零后拼接
      var withoutLeadingZeros = value.replace(/^0+/, '');
      return handleChangeValue(withoutLeadingZeros + numStr);
    }

    // 正常拼接
    return handleChangeValue(value + numStr);
  }, [mode, value, handleChangeValue]);

  /**
   * 处理小数点输入
   */
  var handleDecimalInput = useCallback(function () {
    // 替换模式：直接设置为 "0."
    if (mode === 'replace') {
      return handleChangeValue('0.');
    }

    // 追加模式下，已经包含小数点则忽略
    if (value.includes('.')) {
      return;
    }

    // 空值：设置为 "0."
    if (!value) {
      return handleChangeValue('0.');
    }

    // 全是0的情况：设置为 "0."
    if (/^0+$/.test(value)) {
      return handleChangeValue('0.');
    }

    // 以0开头的整数（如 "001", "0123"）：去除前导零后加小数点
    if (/^0+\d+$/.test(value)) {
      var withoutLeadingZeros = value.replace(/^0+/, '');
      return handleChangeValue(withoutLeadingZeros + '.');
    }

    // 正常情况，追加小数点
    return handleChangeValue(value + '.');
  }, [mode, value, handleChangeValue]);

  /**
   * 处理其他字符输入
   */
  var handleOtherInput = useCallback(function (inputVal) {
    var inputStr = String(inputVal);
    if (mode === 'replace') {
      return handleChangeValue(inputStr);
    }
    return handleChangeValue(value + inputStr);
  }, [mode, value, handleChangeValue]);

  /**
   * 主要的键盘输入处理函数
   */
  var handleKeyInput = useCallback(function (val) {
    switch (val) {
      case undefined:
        break;

      // 确认操作
      case 'ok':
      case 'enter':
      case 'done':
        var validation = validateRange(value);
        if (validation.isValid) {
          onEnter === null || onEnter === void 0 || onEnter(value);
        }
        break;

      // 重置操作
      case 'reset':
        setError(null);
        onReset === null || onReset === void 0 || onReset();
        break;

      // 清空操作
      case 'clear':
        setError(null);
        handleChangeValue('');
        break;

      // 删除操作
      case 'delete':
        handleChangeValue(value.slice(0, -1));
        break;

      // 小数点
      case '.':
        handleDecimalInput();
        break;

      // 数字输入
      default:
        if (isNumber(val) || String(val) === '0') {
          handleNumberInput(val);
        } else {
          // 其他字符
          handleOtherInput(val);
        }
        break;
    }
  }, [value, validateRange, onEnter, onReset, handleChangeValue, handleDecimalInput, handleNumberInput, handleOtherInput]);
  return {
    handleChange: handleKeyInput,
    error: error
  };
};
export default useKeyActions;