import { useEffect, useState } from 'react';

import { textabstandBereinigen, type Textabstand } from '../../../shared/textabstand';

/**
 * Der Textabstand als Eigenschaft der **Anwendung**, nicht der Einstellungskarte.
 *
 * ## Warum dieser Haken nötig ist
 *
 * Die Stufe wirkt über `data-textabstand` am Wurzelelement (siehe
 * `tokens.css`). Bis Fassung 0.24.1 setzte `Textabstandswahl` dieses Attribut
 * in einem eigenen Effekt – also nur, solange das Bedienelement im Baum
 * stand. Es steht in der Einstellungskarte des Startbildschirms, und daraus
 * folgten zwei Fehler:
 *
 * 1. **Vor dem Startbildschirm lag nichts an.** Beim Programmstart durchläuft
 *    `App.tsx` erst die Profilfrage und beim Erststart die Zuschnittfrage. In
 *    keiner von beiden ist der Startbildschirm gerendert; wer „Sehr weit“
 *    eingestellt hatte, las genau die ersten Bildschirme in der
 *    Werksdarstellung.
 * 2. **Es sprang bei jedem Start um.** `useEinstellungen` liefert bis zur
 *    Antwort des Hauptprozesses den Werkswert. Das Attribut stand also
 *    zuerst auf `normal` und wechselte danach sichtbar.
 *
 * ## Warum ein Zwischenspeicher
 *
 * Dieselbe Überlegung und dasselbe Muster wie beim Farbschema
 * (`useThema.ts`): `einstellungen:lesen` ist ein asynchroner Aufruf und
 * antwortet frühestens nach dem ersten Bild. Ohne sofort verfügbaren Wert
 * bliebe das Umspringen – ein Aufblitzen genau bei denen, die auf mehr Luft
 * zwischen den Buchstaben angewiesen sind.
 *
 * Führende Quelle bleibt `einstellungen.json`. Der `localStorage` ist ein
 * Zwischenspeicher und kein zweiter Ablageort; geschrieben wird er nur, wenn
 * die Datei den Wert trägt.
 */
const SPEICHERSCHLUESSEL = 'waffensachkunde.textabstand';

/** Sofort verfügbarer Startwert, damit vor der IPC-Antwort nichts umspringt. */
function ausSpeicher(): Textabstand {
  try {
    return textabstandBereinigen(window.localStorage.getItem(SPEICHERSCHLUESSEL));
  } catch {
    return textabstandBereinigen(undefined);
  }
}

/** Legt den bestätigten Stand in den Zwischenspeicher. */
export function textabstandZwischenspeichern(stufe: Textabstand): void {
  try {
    window.localStorage.setItem(SPEICHERSCHLUESSEL, stufe);
  } catch {
    /* Ohne localStorage entfällt nur der schnelle Startwert; die Einstellung
       selbst liegt in der Datei und geht nicht verloren. */
  }
}

/**
 * Schreibt die Stufe an das Wurzelelement, solange die Anwendung läuft.
 *
 * `gespeichert` ist der Wert aus den Einstellungen – `undefined`, solange
 * noch nichts gelesen wurde. Bis dahin gilt der Zwischenspeicher.
 */
export function useTextabstand(gespeichert: string | undefined): Textabstand {
  const [start] = useState<Textabstand>(ausSpeicher);
  const stufe = gespeichert === undefined ? start : textabstandBereinigen(gespeichert);

  useEffect(() => {
    document.documentElement.dataset['textabstand'] = stufe;
  }, [stufe]);

  useEffect(() => {
    /* Der Zwischenspeicher folgt der Datei – auch dann, wenn sie von
       woanders kommt. Ohne diesen Abgleich zeigte der nächste Start zuerst
       den alten Wert und spränge dann um. */
    if (gespeichert !== undefined) {
      textabstandZwischenspeichern(textabstandBereinigen(gespeichert));
    }
  }, [gespeichert]);

  return stufe;
}
