import { useEffect, useState } from 'react';

import { THEMEN_LEER, type Themen } from '../../../shared/themen';
import { lernBruecke } from '../lernen/bruecke';

/**
 * Einmal geladen, für die ganze Sitzung gültig – wie Erklärungen und Glossar.
 *
 * 29 Gruppen über 230 Fragen; sie ändern sich zur Laufzeit nicht.
 */
let laufend: Promise<Themen | null> | null = null;

function holen(): Promise<Themen | null> {
  laufend ??= (async () => {
    const lesen = lernBruecke()?.themenLaden;
    if (!lesen) {
      return null;
    }
    try {
      return await lesen();
    } catch {
      /* Die Gliederung ist eine Hilfe, keine Voraussetzung. Fehlt sie, steht
         in den Kapiteln II bis IV nur der Knopf für das ganze Kapitel – also
         genau der Zustand vor 0.22.0. */
      return null;
    }
  })();
  return laufend;
}

/** Gegenstück für Tests: leert den Zwischenspeicher. */
export function themenZwischenspeicherLeeren(): void {
  laufend = null;
}

export interface ThemenZustand {
  readonly laedt: boolean;
  /** Nie `null`: Fehlt die Datei, steht hier die leere Gliederung. */
  readonly themen: Themen;
}

export function useThemen(): ThemenZustand {
  const [daten, setzeDaten] = useState<Themen | null>(null);
  const [laedt, setzeLaedt] = useState(true);

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

    void holen().then((ergebnis) => {
      if (!abgebrochen) {
        setzeDaten(ergebnis);
        setzeLaedt(false);
      }
    });

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

  return { laedt, themen: daten ?? THEMEN_LEER };
}
