import { useEffect, useState } from "react";

// Lädt die Items einer konfigurierbaren Auswahlliste (siehe omsorgCore/CLAUDE.md,
// Abschnitt "Konfigurierbare Auswahllisten") über window.omsorg.valueLists.listItems.
// Ersetzt die früher hier hartcodierten Options-Arrays (Mitarbeiterstatus,
// Beschäftigungsart, CRM-Status, Einrichtungstyp, ...).
//
// Modul-weiter Cache: dieselbe Liste wird oft von mehreren gleichzeitig
// gemounteten Komponenten gebraucht (z.B. EmployeesPage + EmployeeForm) und
// ändert sich fast nie (nur über die "Status-Verwaltung"). Ein kurzlebiger
// TTL-Cache erspart wiederholte Netzwerk-Roundtrips bei jedem Seitenaufruf,
// ohne echte Änderungen lange zu verzögern (siehe invalidateValueListCache).
const CACHE_TTL_MS = 60_000;
const cache = new Map(); // key -> { items, fetchedAt }
const inflight = new Map(); // key -> Promise<items>

async function fetchItems(key) {
  let promise = inflight.get(key);
  if (!promise) {
    promise = window.omsorg.valueLists.listItems(key).then((result) => {
      const items = result.ok ? result.data ?? [] : [];
      cache.set(key, { items, fetchedAt: Date.now() });
      return items;
    }).finally(() => {
      inflight.delete(key);
    });
    inflight.set(key, promise);
  }
  return promise;
}

function getCached(key) {
  const entry = cache.get(key);
  if (!entry) return undefined;
  if (Date.now() - entry.fetchedAt > CACHE_TTL_MS) return undefined;
  return entry.items;
}

export function invalidateValueListCache(key) {
  if (key === undefined) {
    cache.clear();
  } else {
    cache.delete(key);
  }
}

export function useValueListItems(key) {
  const cached = getCached(key);
  const [items, setItems] = useState(cached ?? []);
  const [isLoading, setIsLoading] = useState(cached === undefined);

  useEffect(() => {
    let cancelled = false;

    const fresh = getCached(key);
    if (fresh !== undefined) {
      setItems(fresh);
      setIsLoading(false);
      return undefined;
    }

    setIsLoading(true);
    fetchItems(key).then((result) => {
      if (!cancelled) {
        setItems(result);
        setIsLoading(false);
      }
    });

    return () => {
      cancelled = true;
    };
  }, [key]);

  return { items, isLoading };
}
