import '../../../utils/index.mjs';
import { KeyCode } from '../../../utils/KeyCode.mjs';

function isEventFromHandle(e, handles) {
  try {
    return Object.keys(handles).some((key) => e.target === handles[key].ref);
  } catch (error) {
    return false;
  }
}
function isValueOutOfRange(value, { min, max }) {
  return value < min || value > max;
}
function isNotTouchEvent(e) {
  return e.touches.length > 1 || e.type.toLowerCase() === "touchend" && e.touches.length > 0;
}
function getClosestPoint(val, { marks, step, min, max }) {
  const points = Object.keys(marks).map(Number.parseFloat);
  if (step !== null) {
    const baseNum = 10 ** getPrecision(step);
    const maxSteps = Math.floor((max * baseNum - min * baseNum) / (step * baseNum));
    const steps = Math.min((val - min) / step, maxSteps);
    const closestStep = Math.round(steps) * step + min;
    points.push(closestStep);
  }
  const diffs = points.map((point) => Math.abs(val - point));
  return points[diffs.indexOf(Math.min(...diffs))];
}
function getPrecision(step) {
  const stepString = step.toString();
  let precision = 0;
  if (stepString.includes("."))
    precision = stepString.length - stepString.indexOf(".") - 1;
  return precision;
}
function getMousePosition(vertical, e) {
  let zoom = 1;
  if (window.visualViewport)
    zoom = +(window.visualViewport.width / document.body.getBoundingClientRect().width).toFixed(2);
  return (vertical ? e.clientY : e.pageX) / zoom;
}
function getTouchPosition(vertical, e) {
  let zoom = 1;
  if (window.visualViewport)
    zoom = +(window.visualViewport.width / document.body.getBoundingClientRect().width).toFixed(2);
  return (vertical ? e.touches[0].clientY : e.touches[0].pageX) / zoom;
}
function getHandleCenterPosition(vertical, handle) {
  const coords = handle.getBoundingClientRect();
  return vertical ? coords.top + coords.height * 0.5 : window.pageXOffset + coords.left + coords.width * 0.5;
}
function ensureValueInRange(val, { max, min }) {
  if (val <= min)
    return min;
  if (val >= max)
    return max;
  return val;
}
function ensureValuePrecision(val, props) {
  const { step } = props;
  const closestPoint = Number.isFinite(getClosestPoint(val, props)) ? getClosestPoint(val, props) : 0;
  return step === null ? closestPoint : Number.parseFloat(closestPoint.toFixed(getPrecision(step)));
}
function pauseEvent(e) {
  e.stopPropagation();
  e.preventDefault();
}
function calculateNextValue(func, value, props) {
  const operations = {
    increase: (a, b) => a + b,
    decrease: (a, b) => a - b
  };
  const indexToGet = operations[func](Object.keys(props.marks).indexOf(JSON.stringify(value)), 1);
  const keyToGet = Object.keys(props.marks)[indexToGet];
  if (props.step)
    return operations[func](value, props.step);
  if (!!Object.keys(props.marks).length && !!props.marks[keyToGet])
    return props.marks[keyToGet];
  return value;
}
function getKeyboardValueMutator(e, vertical, reverse) {
  const increase = "increase";
  const decrease = "decrease";
  let method = increase;
  switch (e.keyCode) {
    case KeyCode.UP:
      method = vertical && reverse ? decrease : increase;
      break;
    case KeyCode.RIGHT:
      method = !vertical && reverse ? decrease : increase;
      break;
    case KeyCode.DOWN:
      method = vertical && reverse ? increase : decrease;
      break;
    case KeyCode.LEFT:
      method = !vertical && reverse ? increase : decrease;
      break;
    case KeyCode.END:
      return (_value, props) => props.max;
    case KeyCode.HOME:
      return (_value, props) => props.min;
    case KeyCode.PAGE_UP:
      return (value, props) => value + props.step * 2;
    case KeyCode.PAGE_DOWN:
      return (value, props) => value - props.step * 2;
    default:
      return void 0;
  }
  return (value, props) => calculateNextValue(method, value, props);
}

export { calculateNextValue, ensureValueInRange, ensureValuePrecision, getClosestPoint, getHandleCenterPosition, getKeyboardValueMutator, getMousePosition, getPrecision, getTouchPosition, isEventFromHandle, isNotTouchEvent, isValueOutOfRange, pauseEvent };
//# sourceMappingURL=utils.mjs.map
