'use client';

import { useCallback, useEffect, useRef, useState } from 'react';

/**
 * Hover-Peek-Logik für die Sidebar.
 *
 * Asymmetrische Delays sind gewollt:
 *  - 80ms beim Mouse-Enter:  verhindert akzidentielles Auf-Klappen beim Maus-Durchhuschen.
 *    Der User muss bewusst auf der Sidebar landen wollen.
 *  - 200ms beim Mouse-Leave: tolerant gegenüber kurzem Verlassen (Scroll-Wheel,
 *    versehentlich-am-Rand-vorbei). Verhindert Flickern.
 *
 * `enabled=false` → Hook tut nichts (z.B. wenn Sidebar pinned-open ist).
 *
 * Returnt:
 *  - peeking: true wenn das Hover-Peek-Overlay sichtbar sein soll
 *  - bind:    Props die auf den Hover-Trigger-Container müssen (onMouseEnter/Leave)
 *  - close:   Manuelles Schließen (z.B. ESC-Key oder nach Item-Klick)
 */
export interface UseHoverPeekOptions {
  enabled: boolean;
  enterDelayMs?: number;
  leaveDelayMs?: number;
}

export function useHoverPeek({ enabled, enterDelayMs = 80, leaveDelayMs = 200 }: UseHoverPeekOptions) {
  const [peeking, setPeeking] = useState(false);
  const enterTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
  const leaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);

  const clearTimers = () => {
    if (enterTimerRef.current) { clearTimeout(enterTimerRef.current); enterTimerRef.current = null; }
    if (leaveTimerRef.current) { clearTimeout(leaveTimerRef.current); leaveTimerRef.current = null; }
  };

  const onMouseEnter = useCallback(() => {
    if (!enabled) return;
    if (leaveTimerRef.current) { clearTimeout(leaveTimerRef.current); leaveTimerRef.current = null; }
    if (peeking) return;
    enterTimerRef.current = setTimeout(() => setPeeking(true), enterDelayMs);
  }, [enabled, enterDelayMs, peeking]);

  const onMouseLeave = useCallback(() => {
    if (!enabled) return;
    if (enterTimerRef.current) { clearTimeout(enterTimerRef.current); enterTimerRef.current = null; }
    leaveTimerRef.current = setTimeout(() => setPeeking(false), leaveDelayMs);
  }, [enabled, leaveDelayMs]);

  const close = useCallback(() => {
    clearTimers();
    setPeeking(false);
  }, []);

  // Wenn enabled umschaltet (Pin-Toggle), Peek sofort schließen — sonst hängt eine
  // verwaiste Peek-Overlay-Anzeige nach dem Pinning rum.
  useEffect(() => {
    if (!enabled) {
      clearTimers();
      setPeeking(false);
    }
  }, [enabled]);

  // Cleanup bei Unmount
  useEffect(() => {
    return () => clearTimers();
  }, []);

  // ESC schliesst Peek
  useEffect(() => {
    if (!peeking) return;
    const handler = (e: KeyboardEvent) => {
      if (e.key === 'Escape') close();
    };
    window.addEventListener('keydown', handler);
    return () => window.removeEventListener('keydown', handler);
  }, [peeking, close]);

  return {
    peeking,
    bind: { onMouseEnter, onMouseLeave },
    close,
  };
}
