/**
 * Holt die mitgelieferte Datenschutzerklärung.
 *
 * Wortgleich gebaut wie {@link useLizenzen} – dieselbe Aufgabe, derselbe
 * Weg: Der Hauptprozess liest die Datei, der Renderer bekommt fertige
 * Blöcke. Zwei verschiedene Bauformen für dieselbe Sache wären eine Stelle,
 * an der beim nächsten Umbau eine der beiden zurückbleibt.
 *
 * Geladen wird erst, wenn „Über diese Software“ gezeigt wird. Die Datei ist
 * 80 KiB groß; sie beim Start zu lesen verlängerte den Weg zum ersten
 * Bildschirm für etwas, das die meisten nie aufschlagen.
 */

import { useEffect, useState } from 'react';

import type { Datenschutzangaben } from '../../../shared/datenschutz';
import { fehlerMeldung, kanalFehltMeldung, lernBruecke } from '../lernen/bruecke';

export type Datenschutzzustand =
  | { readonly art: 'laedt' }
  | { readonly art: 'fertig'; readonly angaben: Datenschutzangaben }
  | { readonly art: 'fehler'; readonly meldung: string };

const OHNE_KANAL = kanalFehltMeldung(
  'datenschutz:lesen',
  'Die mitgelieferte Datenschutzerklärung lässt sich zurzeit nicht auslesen.',
);

function anfangszustand(): Datenschutzzustand {
  /* Fehlt der Kanal, wird nie etwas geladen; der Fall gehört deshalb in den
     Initialwert und nicht in einen Effekt, der ihn erst nach einer
     Zeichnung meldet. */
  return lernBruecke()?.datenschutzLesen
    ? { art: 'laedt' }
    : { art: 'fehler', meldung: OHNE_KANAL };
}

export function useDatenschutz(): Datenschutzzustand {
  const [zustand, setzeZustand] = useState<Datenschutzzustand>(anfangszustand);

  useEffect(() => {
    const lesen = lernBruecke()?.datenschutzLesen;
    if (!lesen) {
      return undefined;
    }

    let abgebrochen = false;

    void lesen()
      .then((angaben) => {
        if (!abgebrochen) {
          setzeZustand({ art: 'fertig', angaben });
        }
      })
      .catch((fehler: unknown) => {
        if (!abgebrochen) {
          setzeZustand({
            art: 'fehler',
            meldung: fehlerMeldung(fehler, 'Die Datenschutzerklärung konnte nicht gelesen werden.'),
          });
        }
      });

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

  return zustand;
}
