import type { MeldeProgramm } from '../../../shared/meldetext';
import { bridge } from '../bridge';

/**
 * Die Programmangaben für den Meldetext – einmal geholt, dann gemerkt.
 *
 * Sie ändern sich zur Laufzeit nie. Ohne Zwischenspeicher liefe je Frage ein
 * weiterer Aufruf über die Brücke, für eine Antwort, die immer dieselbe ist.
 *
 * In einer eigenen Datei und nicht neben der Komponente: Ein Modul, das
 * sowohl eine Komponente als auch veränderlichen Zustand ausgibt, bricht das
 * schnelle Neuladen im Entwicklungsbetrieb – und der Zwischenspeicher wäre
 * für Tests nicht erreichbar.
 */
let versprechen: Promise<MeldeProgramm> | null = null;

export function programmangabenHolen(): Promise<MeldeProgramm> {
  versprechen ??= (async (): Promise<MeldeProgramm> => {
    const lesen = bridge()?.anwendungsInfoLesen;
    if (lesen === undefined) {
      /* Ohne Anwendungskern bleibt die Zeile leer statt falsch. Der Meldetext
         ist auch ohne Fassungsangabe brauchbar – die Fragennummer trägt ihn. */
      return { fassung: '', baukennung: '', baustand: '' };
    }
    const info = await lesen();
    /* Nur die drei Skalare, nicht das ganze Objekt: An `AnwendungsInfo` hängt
       `datenbank.meldung`, die im Fehlerfall einen Dateipfad enthalten kann.
       Was nicht übergeben wird, kann auch nicht versehentlich mitreisen. */
    return {
      fassung: info.anwendungsVersion,
      baukennung: info.baukennung,
      baustand: info.baustand,
    };
  })();
  return versprechen;
}

/** Leert den Zwischenspeicher – nötig zwischen zwei Tests. */
export function programmangabenVergessen(): void {
  versprechen = null;
}
