/**
 * Die Textabstände – Zeilen-, Wort- und Zeichenabstand in Stufen.
 *
 * **Warum es das gibt.** WCAG 1.4.12 (Textabstand) verlangt, dass sich Text
 * mit weiterem Zeilen-, Wort- und Zeichenabstand darstellen lässt, ohne dass
 * Inhalt verlorengeht. Im Browser erfüllt man das, indem man nutzereigene
 * Stilblätter toleriert; der eigene Prüfplan stellt den Fall entsprechend mit
 * einem Entwicklerwerkzeug-Stilblatt nach.
 *
 * In einer ausgelieferten Electron-Anwendung hat der Endnutzer aber weder
 * Erweiterungen noch Entwicklerwerkzeuge — der Einzige, der die Abstände
 * ändern könnte, ist die Anwendung selbst. Formal ist das kein Verstoß gegen
 * 1.4.12: In einer geschlossenen Umgebung misst das Kriterium die Toleranz
 * gegenüber Overrides, die es hier gar nicht geben kann. Es ist trotzdem eine
 * Lücke, und zwar bei denen, für die das Kriterium geschrieben wurde:
 * Menschen mit Legasthenie, mit Sehbehinderung, mit Konzentrationsstörungen.
 * Für sie ist die (gute) Vorgabe 1,65 manchmal einfach zu eng.
 *
 * **Die Werte der weiteren Stufe** sind genau die aus 1.4.12: Zeilenhöhe das
 * 1,5-fache der Schriftgröße, Wortabstand 0,16 em, Zeichenabstand 0,12 em.
 * Weil die Anwendung schon bei 1,65 anfängt, liegt die weitere Stufe darüber
 * und nicht darunter — das Kriterium nennt Mindestwerte, keine Sollwerte.
 */

/** Die wählbaren Stufen. */
export const TEXTABSTAENDE = ['normal', 'weit', 'sehr-weit'] as const;

export type Textabstand = (typeof TEXTABSTAENDE)[number];

export const TEXTABSTAND_STANDARD: Textabstand = 'normal';

/** Beschriftung für die Bedienelemente und die Ansage. */
export const TEXTABSTAND_BEZEICHNUNG: Readonly<Record<Textabstand, string>> = Object.freeze({
  normal: 'Normal',
  weit: 'Weit',
  'sehr-weit': 'Sehr weit',
});

/** Was die Stufe bewirkt – steht als erklärender Satz am Bedienelement. */
export const TEXTABSTAND_ERKLAERUNG: Readonly<Record<Textabstand, string>> = Object.freeze({
  normal: 'Die gewohnte Darstellung.',
  weit: 'Mehr Luft zwischen Zeilen, Wörtern und Buchstaben.',
  'sehr-weit': 'Noch mehr Luft – für längere Texte am Stück.',
});

export function istTextabstand(wert: unknown): wert is Textabstand {
  return typeof wert === 'string' && (TEXTABSTAENDE as readonly string[]).includes(wert);
}

export function textabstandBereinigen(wert: unknown): Textabstand {
  return istTextabstand(wert) ? wert : TEXTABSTAND_STANDARD;
}

/** „Zeilenabstand: Weit“ – für die Live-Region nach dem Umstellen. */
export function textabstandAnsage(stufe: Textabstand): string {
  return `Textabstand: ${TEXTABSTAND_BEZEICHNUNG[stufe]}.`;
}
