import { UPDATE_MODEL_EVENT, INPUT_EVENT } from "../../../../constants/event.mjs";
import { isNumber } from "../../../../utils/types.mjs";
import { throwError, debugWarn } from "../../../../utils/error.mjs";
import { watch } from "vue";
import { isArray } from "../../../../../../@vue/shared/dist/shared.esm-bundler.mjs";
const useWatch = (props, initData, minValue, maxValue, emit, elFormItem) => {
  const _emit = (val) => {
    emit(UPDATE_MODEL_EVENT, val);
    emit(INPUT_EVENT, val);
  };
  const valueChanged = () => {
    if (props.range) return ![minValue.value, maxValue.value].every((item, index) => item === initData.oldValue[index]);
    else return props.modelValue !== initData.oldValue;
  };
  const setValues = () => {
    var _a, _b;
    if (props.min > props.max) throwError("Slider", "min should not be greater than max.");
    const val = props.modelValue;
    if (props.range && isArray(val)) if (val[1] < props.min) _emit([props.min, props.min]);
    else if (val[0] > props.max) _emit([props.max, props.max]);
    else if (val[0] < props.min) _emit([props.min, val[1]]);
    else if (val[1] > props.max) _emit([val[0], props.max]);
    else {
      initData.firstValue = val[0];
      initData.secondValue = val[1];
      if (valueChanged()) {
        if (props.validateEvent) (_a = elFormItem == null ? void 0 : elFormItem.validate) == null ? void 0 : _a.call(elFormItem, "change").catch((err) => debugWarn(err));
        initData.oldValue = val.slice();
      }
    }
    else if (!props.range && isNumber(val) && !Number.isNaN(val)) if (val < props.min) _emit(props.min);
    else if (val > props.max) _emit(props.max);
    else {
      initData.firstValue = val;
      if (valueChanged()) {
        if (props.validateEvent) (_b = elFormItem == null ? void 0 : elFormItem.validate) == null ? void 0 : _b.call(elFormItem, "change").catch((err) => debugWarn(err));
        initData.oldValue = val;
      }
    }
  };
  setValues();
  watch(() => initData.dragging, (val) => {
    if (!val) setValues();
  });
  watch(() => props.modelValue, (val, oldVal) => {
    if (initData.dragging || isArray(val) && isArray(oldVal) && val.every((item, index) => item === oldVal[index]) && initData.firstValue === val[0] && initData.secondValue === val[1]) return;
    setValues();
  }, { deep: true });
  watch(() => [props.min, props.max], () => {
    setValues();
  });
};
export {
  useWatch
};
