var _excluded = ["format", "value", "onChange", "onDateChange"];
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
import React, { useMemo } from 'react';
import { DatePicker, Input } from 'antd';
import "./detePickerCpt.less";
/**
 * 校验时间字符串是否符合格式
 * @param dateString
 * @param format
 */
var isValidDate = function isValidDate(dateString, format) {
  var date = window.dayjs(dateString, format, true);
  return date.isValid();
};
var DatePickerInput = function DatePickerInput(props) {
  var format = props.format,
    value = props.value,
    onChange = props.onChange,
    onDateChange = props.onDateChange,
    others = _objectWithoutProperties(props, _excluded);

  /**
   * 数据输入变更事件
   * @param val
   */
  var eventChange = function eventChange(val) {
    onChange === null || onChange === void 0 || onChange({
      target: {
        value: val
      }
    });
    if (isValidDate(val, format)) {
      onDateChange === null || onDateChange === void 0 || onDateChange(window.dayjs(val, format), window.dayjs(val, format).format(format));
    }
  };
  var handleChange = function handleChange(e) {
    var inputValue = e.target.value;

    // 禁止特殊字符时
    if (!/^[\d/]*$/.test(inputValue)) {
      return;
    }

    // 根据 format 字符串，将字母部分分离开来
    var parts = format.split(/[^a-zA-Z]/);

    // 提取 format 中的分隔符
    var separators = format.match(/[^a-zA-Z]+/g) || [];

    // 如果输入值长度小于之前的值，说明用户正在删除字符，直接触发 eventChange 事件
    if (inputValue.length < value.length) {
      eventChange === null || eventChange === void 0 || eventChange(inputValue);
      return;
    }

    // 光标位置，用于跟踪当前输入的位置
    var cursor = 0;
    // 格式化后的结果
    var result = '';
    // 记录上一个分隔符后的索引位置
    var lastIndex = 0;

    // 遍历格式化字符串的部分
    for (var i = 0; i < parts.length; i++) {
      // 当前字母部分
      var part = parts[i];
      // 如果部分为空，则跳过
      if (!part) continue;

      // 当前部分的分隔符
      var separator = separators[i] || '';
      // 当前部分的期望长度
      var expectedLength = part.length;

      // 更新 lastIndex 到当前部分末尾（加上分隔符长度）
      lastIndex = lastIndex + part.length + separator.length;

      // 计算当前部分的起始和结束位置
      var start = cursor;
      if (i > 0) {
        start += separators.slice(0, i).join('').length;
      }
      var end = start + expectedLength;
      // 从用户输入中提取对应部分
      var userPart = inputValue.slice(start, end);

      // 如果当前部分有输入，添加前一个分隔符
      if (userPart.length > 0) {
        result += separators[i - 1] || '';
      }

      // 如果当前部分没有输入且格式化结果的最后一个字符不同于输入值的对应字符
      if (userPart.length === 0 && result.slice(result.length - 1) !== inputValue.slice(result.length - 1)) {
        userPart = inputValue.slice(result.length - 1);
      }

      // 如果当前部分包含 'Y'（表示年份等），直接添加用户输入
      if (part.includes('Y')) {
        result += userPart;
      } else {
        // 对日期时间部分的特殊处理（如月份、日期等）
        if (userPart.length === 1 && ['M', 'D', 'H', 'm', 's'].includes(part[0])) {
          if ('M' === part[0] && userPart > 1) {
            // 月份第一位如果大于1，前面加 '0'
            userPart = '0' + userPart;
          }
          if ('D' === part[0] && userPart > 3) {
            // 日期第一位如果大于3，前面加 '0'
            userPart = '0' + userPart;
          }
          if ('H' === part[0] && userPart > 2) {
            // 小时第一位如果大于2，前面加 '0'
            userPart = '0' + userPart;
          }
          if ('m' === part[0] && userPart > 7) {
            // 分钟第一位如果大于7，前面加 '0'
            userPart = '0' + userPart;
          }
          if ('s' === part[0] && userPart > 7) {
            // 秒数第一位如果大于7，前面加 '0'
            userPart = '0' + userPart;
          }
        }
        result += userPart;
      }

      // 如果当前部分长度达到期望且下一个字符不是分隔符，则添加分隔符
      if (userPart.length === expectedLength && !inputValue.slice(lastIndex - 1).startsWith(separator)) {
        result += separator;
      }
      // 更新光标位置
      cursor += userPart.length;
    }
    eventChange === null || eventChange === void 0 || eventChange(result);
  };
  return /*#__PURE__*/React.createElement(Input, _extends({}, others, {
    type: "tel",
    value: value,
    onChange: handleChange
  }));
};

/**
 * 当前日期组件实例
 * @param props
 * @constructor
 */
var DatePickerCpt = function DatePickerCpt(props) {
  var format = props.format,
    type = props.type,
    onChange = props.onChange,
    size = props.size,
    picker = props.picker;

  /**
   * 不同类型时注入参数
   */
  var propsObj = useMemo(function () {
    if (picker && picker !== 'date') {
      return {
        inputRender: undefined
      };
    }
    if (type === 'input') {
      return {
        popupClassName: 'pisell-date-picker-type-input',
        suffixIcon: null,
        placeholder: format || ""
      };
    } else if (type === 'select') {
      return {
        inputReadOnly: true
      };
    }
    return {};
  }, [type, picker, format]);
  return /*#__PURE__*/React.createElement(DatePicker, _extends({}, props, {
    className: 'pisell-date-picker'
    // size={size ?? 'large'}
    ,
    inputRender: function inputRender(props) {
      return /*#__PURE__*/React.createElement(DatePickerInput, _extends({}, props, {
        onDateChange: onChange,
        format: format
      }));
    }
  }, propsObj));
};
export default DatePickerCpt;