import { onBeforeUnmount } from 'vue';

export interface SplitterOptions {
  axis: 'x' | 'y';
  min: number;
  max: number;
  /** Poignée à droite / en bas du panneau : le sens du drag est inversé. */
  invert?: boolean;
  get: () => number;
  set: (v: number) => void;
}

/**
 * Calcule la nouvelle taille (fonction pure, testable) : delta de position depuis le début du
 * drag, inversion éventuelle, puis clamp entre min et max.
 */
export function nextSize(
  startSize: number,
  startPos: number,
  curPos: number,
  o: { min: number; max: number; invert?: boolean },
): number {
  let delta = curPos - startPos;
  if (o.invert) delta = -delta;
  return Math.min(o.max, Math.max(o.min, startSize + delta));
}

/**
 * Poignée de redimensionnement générique (pointer events : souris, tactile, stylet).
 * Généralise le resize à la souris de l'ancienne WorkspaceView. Écrit via `opts.set`
 * (typiquement une ref persistée), ce qui permet de persister largeurs/hauteurs de panneaux.
 */
export function useSplitter(opts: SplitterOptions): { onPointerDown: (ev: PointerEvent) => void } {
  let stop: (() => void) | null = null;

  function onPointerDown(ev: PointerEvent): void {
    ev.preventDefault();
    const startPos = opts.axis === 'x' ? ev.clientX : ev.clientY;
    const startSize = opts.get();
    const onMove = (e: PointerEvent): void => {
      const cur = opts.axis === 'x' ? e.clientX : e.clientY;
      opts.set(nextSize(startSize, startPos, cur, opts));
    };
    const onUp = (): void => {
      window.removeEventListener('pointermove', onMove);
      window.removeEventListener('pointerup', onUp);
      stop = null;
    };
    window.addEventListener('pointermove', onMove);
    window.addEventListener('pointerup', onUp);
    stop = onUp;
  }

  onBeforeUnmount(() => stop?.());
  return { onPointerDown };
}
