/**
 * Oberflächen-eigene Typen des Lernmodus.
 *
 * Der verbindliche Vertrag steht in `src/shared/`. Hier stehen nur Begriffe,
 * die ausschließlich die Darstellung betreffen – etwa welche Ansicht gerade
 * sichtbar ist oder wie eine beendete Sitzung zusammengefasst wird.
 */

import type { SitzungsFilter } from '../../../shared/lernstand';
import type { Pruefungsabschluss, Pruefungslauf } from '../pruefung/typen';

/** Woher die Fragen einer Sitzung stammen. */
export type Sitzungsquelle =
  /** Der Anwendungskern stellt die Fragen nach Filter zusammen. */
  | { readonly art: 'filter'; readonly filter: SitzungsFilter }
  /** Feste Fragenliste – etwa beim Wiederholen der Fehler einer Sitzung. */
  | {
      readonly art: 'fragen';
      readonly frageIds: readonly string[];
      /**
       * Sollen die Antwortmöglichkeiten die Stelle wechseln?
       *
       * Bei einer Sitzung nach Filter stellt der Anwendungskern die
       * Reihenfolge; bei einer festen Liste wird er gar nicht gefragt, und die
       * Einstellung erreichte diesen Weg bis Fassung 0.24.1 nirgends. Wer den
       * Schalter einschaltete, bekam in „Fehler wiederholen", „Fehler aus der
       * Prüfungssimulation", „Hartnäckige Fragen", „Verwandte Fragen", jeder
       * Themensitzung und jeder aus der Suche gestarteten Sitzung weiterhin
       * die Katalogreihenfolge — obwohl die Beschriftung des Schalters ohne
       * Einschränkung zusagt, die Einstellung gelte auch in der
       * Prüfungssimulation.
       */
      readonly optionenMischen?: boolean;
    };

export interface Sitzungsauftrag {
  /**
   * Eindeutig je Start. Dient als React-Schlüssel, damit eine neue Sitzung
   * garantiert frisch aufsetzt und keine Reste der vorigen behält.
   */
  readonly id: number;
  /** Kurzer Name der Sitzung, erscheint in Überschrift und Auswertung. */
  readonly titel: string;
  readonly quelle: Sitzungsquelle;
  /**
   * Die Suchanfrage, aus der diese Sitzung gestartet wurde.
   *
   * Nur gesetzt, wenn sie aus der Suchansicht kommt. Sie wird bis in die
   * Auswertung durchgereicht, damit von dort ein Weg zurück in dieselbe
   * Trefferliste führt – wer eine Frage aus einer Suche übt, will danach die
   * übrigen Treffer sehen und nicht wieder von vorn tippen.
   *
   * Bis Fassung 0.26.0 stand hier nur der **Text**, und das Ziel wurde
   * damit verfehlt: Wer auf einen Bereich eingeschränkt hatte, bekam danach
   * die Liste über dem ganzen Katalog. „Dieselbe“ war sie dann nicht (siehe
   * Befund B3 in `docs/handbuchpruefung-befunde.md`).
   */
  readonly ausSuche?: Suchanfrage | undefined;
}

/**
 * Eine Suchanfrage – Text und Bereich, untrennbar.
 *
 * Sie reisen als Paar, weil eine Trefferliste erst aus beidem entsteht.
 * Kämen sie einzeln zurück, stünde nach dem Rückweg eine Liste da, die der
 * Nutzende nie gesehen hat: leeres Feld mit gesetztem Bereich, oder der
 * Begriff über dem ganzen Katalog.
 */
export interface Suchanfrage {
  readonly text: string;
  /** `null` steht für „alle Bereiche“ – wie in `shared/fragensuche.ts`. */
  readonly bereich: string | null;
}

/**
 * Welche Ansicht die Anwendung zeigt. Bewusst ohne Router.
 *
 * Neben dem Lernmodus gehören dazu die Prüfungssimulation und der Bereich
 * „Über diese Software“; die Zustandsumschaltung bleibt an einer Stelle.
 */
export type Ansicht =
  | { readonly art: 'start' }
  | { readonly art: 'kapitelwahl' }
  | { readonly art: 'sitzung'; readonly auftrag: Sitzungsauftrag }
  | { readonly art: 'auswertung'; readonly bilanz: SitzungsBilanz }
  | { readonly art: 'pruefungswahl' }
  | { readonly art: 'pruefung'; readonly lauf: Pruefungslauf }
  | { readonly art: 'pruefungsergebnis'; readonly abschluss: Pruefungsabschluss }
  | { readonly art: 'glossar' }
  /*
    Die Anfrage ist ein ÜBERGABEWERT und kein laufender Zustand: Sie wird
    beim Betreten einmal gelesen und danach nie wieder angefasst –
    `useFragensuche` führt Text und Bereich selbst. Deshalb steht sie hier
    und nicht als Merkwert daneben.

    Der Einwand, den `App.tsx` beim Suchtext erhebt („jeder Tastenanschlag
    im Suchfeld risse den Fokus aus dem Feld auf die Überschrift“), trifft
    den laufenden Wert, nicht den übergebenen. `auftrag` und `bilanz` in
    den Zeilen darüber sind seit jeher von derselben Art.
  */
  | { readonly art: 'suche'; readonly anfrage?: Suchanfrage | undefined }
  | { readonly art: 'ueber' };

/** Eine falsch beantwortete Frage, wie sie die Auswertung auflistet. */
export interface FalscheFrage {
  readonly frageId: string;
  readonly amtlicheNummer: string;
  readonly text: string;
}

/** Zusammenfassung einer beendeten Sitzung. */
export interface SitzungsBilanz {
  readonly titel: string;
  /** Die Suchanfrage, falls die Sitzung aus der Suche kam. */
  readonly ausSuche?: Suchanfrage | undefined;
  readonly gesamt: number;
  readonly beantwortet: number;
  readonly richtig: number;
  readonly falsch: number;
  readonly falscheFragen: readonly FalscheFrage[];
}

/** Anteil richtiger Antworten in Prozent, ganzzahlig gerundet. */
export function trefferquote(bilanz: SitzungsBilanz): number {
  if (bilanz.beantwortet === 0) {
    return 0;
  }
  return Math.round((bilanz.richtig / bilanz.beantwortet) * 100);
}
