import { useEffect, useState } from 'react';

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

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

const OHNE_KANAL = kanalFehltMeldung(
  'lizenzen:lesen',
  'Die mitgelieferten Lizenztexte lassen sich zurzeit nicht auslesen.',
);

function anfangszustand(): Lizenzzustand {
  /* Ob überhaupt gelesen werden kann, steht schon beim ersten Render fest –
     der Fall gehört deshalb in den Initialwert und nicht in einen Effekt. */
  return lernBruecke()?.lizenzenLesen ? { art: 'laedt' } : { art: 'fehler', meldung: OHNE_KANAL };
}

/**
 * Lädt die Lizenzangaben für den Bereich „Über diese Software“.
 *
 * Scheitert der Kanal, bleibt der Bereich bedienbar: Die Pflichtangaben zur
 * eigenen Lizenz und zum amtlichen Fragenkatalog stehen als Festtexte im
 * Vertrag und werden dann von dort gezeigt.
 */
export function useLizenzen(): Lizenzzustand {
  const [zustand, setzeZustand] = useState<Lizenzzustand>(anfangszustand);

  useEffect(() => {
    const lesen = lernBruecke()?.lizenzenLesen;
    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 Lizenzangaben konnten nicht gelesen werden.'),
          });
        }
      });

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

  return zustand;
}
