/**
 * Wer gerade prüft, soll das Fenster nicht versehentlich schließen.
 *
 * **Warum der Hauptprozess das wissen muss.** `close` entsteht dort – am
 * Fensterkreuz, über Alt+F4 und über „Datei → Beenden“. Der Renderer bekommt
 * davon nichts mit und kann die Frage deshalb nicht selbst stellen.
 *
 * **Warum ein Abgleich und keine Kantenmeldung.** Der Renderer schickt seinen
 * Zustand auch beim Aufbau – also `false` nach einem Neuladen. Bliebe der
 * Merker sonst hängen, hinge das Fenster für immer an einer Rückfrage zu
 * einer Prüfung, die es nicht mehr gibt. Zusätzlich wird er vergessen, wenn
 * ein neues Dokument geladen wird oder der Renderer stirbt: zwei unabhängige
 * Wege, damit ein Absturz das Fenster nicht unschließbar macht.
 */

import type { BrowserWindow, WebContents } from 'electron';

/** Kennungen der `webContents`, in denen gerade eine Prüfung läuft. */
const laufend = new Set<number>();

/** Der Renderer meldet seinen Zustand – auch unverändert. */
export function laufMelden(inhalt: WebContents, laeuft: boolean): void {
  if (laeuft) {
    laufend.add(inhalt.id);
  } else {
    laufend.delete(inhalt.id);
  }
}

/** Vergisst den Merker – bei neuem Dokument, Absturz oder Abbau. */
export function laufVergessen(inhalt: WebContents): void {
  laufend.delete(inhalt.id);
}

/** Läuft in diesem Fenster gerade eine Prüfung? */
export function laeuftPruefung(fenster: BrowserWindow): boolean {
  return !fenster.webContents.isDestroyed() && laufend.has(fenster.webContents.id);
}

/** Gegenstück für Tests. */
export function laufwaechterLeeren(): void {
  laufend.clear();
}
