/**
 * Was vorgelesen wird – reine Funktionen.
 *
 * Getrennt von der Anzeige, weil Gesprochenes andere Ansprüche stellt: Wer
 * die Frage sieht, erfasst die Antwortmöglichkeiten als Liste; wer sie hört,
 * braucht vor jeder das Label, sonst weiß er am Ende nicht, welche „a“ war.
 * Umgekehrt ist die Kapitelangabe über der Frage gesprochen nur Ballast.
 */

import type { Antwortoption, Frage } from '../../../shared/katalog';

/**
 * Frage samt Antwortmöglichkeiten.
 *
 * Gesprochen wird der amtliche Buchstabe, nicht die Anzeigestelle – derselbe,
 * den der Lösungssatz, die Erklärung und der gedruckte Katalog nennen. Nur so
 * bleibt für den Hörer auflösbar, wovon anschließend die Rede ist.
 *
 * Die Reihenfolge ist die angezeigte – wird gemischt dargestellt, wird auch
 * gemischt vorgelesen. Alles andere wäre eine zweite, unsichtbare Ordnung.
 */
export function frageVorlesen(frage: Frage, optionen: readonly Antwortoption[]): string {
  const teile = [frage.frage.text.trim()];

  if (optionen.length > 0) {
    teile.push('Die Antwortmöglichkeiten:');
    for (const option of optionen) {
      teile.push(`${option.label}: ${option.inhalt.text.trim()}`);
    }
  }

  return teile.join('\n');
}

/** Bestandteile der gesprochenen Rückmeldung nach dem Bestätigen. */
export interface Ergebnisteile {
  /** „Richtig“, „Unvollständig“, „Falsch“ oder die Selbstbewertung. */
  readonly titel: string;
  /** Sätze des Ergebnisbereichs, in der angezeigten Reihenfolge. */
  readonly saetze: readonly string[];
  /** Musterantwort bei offenen Fragen. */
  readonly musterantwort?: string | undefined;
  /** Kurzfassung der Erklärung; der Volltext wäre zu lang zum Zuhören. */
  readonly erklaerung?: string | undefined;
}

/**
 * Die Rückmeldung nach dem Bestätigen.
 *
 * Bewusst die *Kurzfassung* der Erklärung: Der Volltext ist im Mittel 1200
 * Zeichen lang und dauert gesprochen über eineinhalb Minuten. Wer ihn hören
 * will, ruft ihn im Ergebnisbereich eigens auf; automatisch abgespielt wäre
 * er eine Zumutung, gerade weil danach die nächste Frage kommt.
 */
export function ergebnisVorlesen(teile: Ergebnisteile): string {
  const zeilen = [`${teile.titel}.`, ...teile.saetze.map((satz) => satz.trim())];

  if (teile.musterantwort !== undefined && teile.musterantwort.trim().length > 0) {
    zeilen.push(`Musterantwort: ${teile.musterantwort.trim()}`);
  }
  if (teile.erklaerung !== undefined && teile.erklaerung.trim().length > 0) {
    zeilen.push(teile.erklaerung.trim());
  }

  return zeilen.filter((zeile) => zeile.length > 0).join('\n');
}
