"use client";
import { useCallback, useRef, useState } from "react";

/**
 * Beheert een meervoudige selectie (checkboxes) over een geordende lijst van
 * id's, met dezelfde klikconventies als een bestandsverkenner:
 * - gewone klik: enkel dit item aan/uit, ankerpunt verspringt naar hier;
 * - Ctrl/Cmd-klik: dit item toevoegen/verwijderen zonder de rest te wijzigen;
 * - Shift-klik: alles tussen het ankerpunt en dit item selecteren.
 */
export function useMeervoudigeSelectie(zichtbareIds: string[]) {
  const [geselecteerd, setGeselecteerd] = useState<Set<string>>(new Set());
  const ankerRef = useRef<string | null>(null);

  const klik = useCallback(
    (id: string, event: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean }) => {
      setGeselecteerd((vorige) => {
        const next = new Set(vorige);
        if (event.shiftKey && ankerRef.current) {
          const van = zichtbareIds.indexOf(ankerRef.current);
          const tot = zichtbareIds.indexOf(id);
          if (van !== -1 && tot !== -1) {
            const [start, eind] = van <= tot ? [van, tot] : [tot, van];
            for (let i = start; i <= eind; i++) next.add(zichtbareIds[i]);
            return next;
          }
        }
        if (event.ctrlKey || event.metaKey) {
          if (next.has(id)) next.delete(id);
          else next.add(id);
        } else {
          if (next.has(id) && next.size === 1) next.delete(id);
          else {
            next.clear();
            next.add(id);
          }
        }
        ankerRef.current = id;
        return next;
      });
    },
    [zichtbareIds]
  );

  const wisSelectie = useCallback(() => {
    setGeselecteerd(new Set());
    ankerRef.current = null;
  }, []);

  return { geselecteerd, klik, wisSelectie };
}
