export default function snap(
  value: number,
  snapSize: number,
  method: 'floor' | 'ceil' | null = null,
  maxShift: number = Infinity
) {
  let result = value;
  if (snapSize === 0) {
    result = value;
  } else if (method === 'floor') {
    result = Math.floor(value / snapSize) * snapSize;
  } else if (method === 'ceil') {
    result = Math.ceil(value / snapSize) * snapSize;
  } else {
    result = Math.round(value / snapSize) * snapSize;
  }
  if (Math.abs(result - value) > maxShift) {
    result = value;
  }
  return result;
}

export const snapWithEvent = (
  event: MouseEvent | TouchEvent,
  value: number,
  snapSize: number,
  method: 'floor' | 'ceil' | null = null,
  maxShift: number = Infinity,
  absoluteAnchors: number[] = []
) => {
  if (event.ctrlKey || event.metaKey) {
    return value;
  }
  let result = value;
  if (snapSize === 0) {
    result = value;
  } else if (method === 'floor') {
    result = Math.floor(value / snapSize) * snapSize;
  } else if (method === 'ceil') {
    result = Math.ceil(value / snapSize) * snapSize;
  } else {
    result = Math.round(value / snapSize) * snapSize;
  }

  if (absoluteAnchors.length > 0) {
    const closestAnchor = absoluteAnchors.reduce((closest, anchor) => {
      return Math.abs(anchor - value) < Math.abs(closest - value)
        ? anchor
        : closest;
    }, result);
    result = closestAnchor;
  }

  if (Math.abs(result - value) > maxShift) {
    result = value;
  }

  return result;
};
