/**
 * Die hartnäckigen Fragen eines Profils.
 *
 * ## Warum der Zustand hier liegt und nicht im Baustein
 *
 * Bis Fassung 0.25.0 lud `Hartnaeckige.tsx` seine Liste selbst, beim
 * Einhängen. Der Startbildschirm hängt bei jedem Ansichtswechsel vollständig
 * aus; die Liste war beim Zurückkommen also wieder leer und wurde erneut über
 * den Kanal geholt.
 *
 * Solange jeder Rückweg am Seitenanfang endete, fiel das nicht auf. Seit der
 * Rückweg dort ankommt, wo er begann (siehe `App.tsx`, `letzterAufbruch`),
 * fällt es sofort auf: Der Baustein steht in der Karte „Ihr Lernstand im
 * Einzelnen“ und damit **oberhalb** von drei der vier Zielkarten. Er gibt
 * zunächst `null` zurück, der Effekt rollt die Zielkarte an den oberen Rand,
 * und danach erscheint der Block darüber und schiebt sie um seine eigene Höhe
 * nach unten. Nachrollen wäre ein bewegliches Ziel und deshalb keine Lösung.
 *
 * Hier gehalten, überlebt die Liste den Ansichtswechsel, und die Höhe der
 * Karte steht schon beim ersten Bildaufbau fest.
 *
 * ## Warum die Profilnummer mitgeführt wird
 *
 * Dasselbe Muster wie in `useLernplan` und `useOffenePruefung`, und aus
 * demselben Grund: Ohne sie blieb die Liste nach einem Profilwechsel stehen,
 * wenn der Kanal nicht antwortete. Unter der Überschrift des neuen Profils
 * stünden dann die Fragen des alten, und „Diese Fragen üben“ startete unter
 * dem neuen Profil eine Sitzung mit fremden Frage-IDs.
 */

import { useEffect, useState } from 'react';

import type { HartnaeckigeFrage } from '../../../shared/hartnaeckig';
import { lernBruecke } from '../lernen/bruecke';

type Ergebnis = {
  readonly profilId: number;
  readonly fragen: readonly HartnaeckigeFrage[];
} | null;

export function useHartnaeckige(profilId: number | null): readonly HartnaeckigeFrage[] {
  const [gelesen, setzeGelesen] = useState<Ergebnis>(null);

  useEffect(() => {
    const lesen = lernBruecke()?.lernHartnaeckige;
    if (!lesen || profilId === null) {
      return undefined;
    }

    let lebt = true;
    void lesen(profilId)
      .then((antwort) => {
        if (lebt) {
          setzeGelesen({ profilId, fragen: antwort });
        }
      })
      .catch(() => {
        /* Die Liste entfällt wirklich – eine stehengebliebene wäre eine
           fremde Auskunft unter dem falschen Namen. */
        if (lebt) {
          setzeGelesen({ profilId, fragen: [] });
        }
      });

    return () => {
      lebt = false;
    };
  }, [profilId]);

  return gelesen !== null && gelesen.profilId === profilId ? gelesen.fragen : [];
}
