/**
 * Das Fehlerprotokoll – die Fragen, die zuletzt falsch beantwortet wurden.
 *
 * Das Dokument, mit dem jemand ohne Rechner weiterarbeitet. Es enthält genau
 * die Menge, die auf dem Startbildschirm hinter „Nur Fehler“ steht: Was dort
 * als Fehler gilt, steht hier auf dem Papier. Eine zweite Zählweise daneben
 * wäre die Art Widerspruch, die diese Anwendung schon zweimal abgeschafft hat.
 *
 * **Die Antwortmöglichkeiten stehen vollständig da.** Nachgemessen nennen
 * 302 der 471 Erklärungen zu Auswahlfragen eine *falsche* Option beim
 * Buchstaben; ein Dokument mit nur der richtigen Antwort machte seine eigenen
 * Begründungen unlesbar.
 *
 * **Der Umfang ist erheblich und wird vorher gesagt.** Gemessen an wirklich
 * gedruckten PDF: 60 Fragen mit Kurzerklärung ergeben 21 Seiten, 150 Fragen
 * mit voller Begründung 161 Seiten, und der schlimmste Fall – 486 Fragen,
 * volle Begründung, Großdruck – 982 Seiten. Die Oberfläche nennt die
 * geschätzte Zahl, bevor der Speicherdialog aufgeht.
 */

import { absatz, dokumentBauen, type Quellenangabe } from './dokument';
import { frageblock, type Papierfrage } from './frageblock';
import type { Schriftgroesse } from './stil';

/** Wie ausführlich die Begründungen ausfallen. */
export type Erklaerungstiefe = 'kurz' | 'voll';

export interface Fehlerprotokolldaten {
  readonly fragen: readonly Papierfrage[];
  readonly profilName: string;
  readonly erstelltAm: string;
  readonly tiefe: Erklaerungstiefe;
  readonly quelle: Quellenangabe;
  readonly schriftgroesse: Schriftgroesse;
}

/** Deutsches Datum – dieselbe Formatierung wie im Lernbericht. */
function datum(iso: string): string {
  const wert = new Date(iso);
  return Number.isNaN(wert.getTime())
    ? 'ohne Datum'
    : wert.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' });
}

/**
 * Der Vorspann.
 *
 * Er sagt, worauf die Auswahl beruht, und er sagt es im Singular, wenn es
 * eine einzige Frage ist – der Fall ist erreichbar und kommt nach einer
 * guten Sitzung sogar häufig vor.
 */
function vorspann(anzahl: number, tiefe: Erklaerungstiefe): string {
  if (anzahl === 0) {
    return absatz(
      'In diesem Lernprofil ist derzeit keine Frage als zuletzt falsch beantwortet vermerkt. ' +
        'Das Dokument bleibt deshalb leer.',
    );
  }

  const menge =
    anzahl === 1
      ? 'Hier steht die eine Frage, die Sie zuletzt falsch beantwortet haben.'
      : `Hier stehen die ${String(anzahl)} Fragen, die Sie zuletzt falsch beantwortet haben.`;

  const nachtrag =
    tiefe === 'voll'
      ? 'Zu jeder Frage stehen die vollständige Begründung und die Fundstellen im Gesetz.'
      : 'Zu jeder Frage steht die Kurzerklärung. Die ausführliche Begründung lässt sich beim Erzeugen zuschalten.';

  return absatz(
    `${menge} Sobald Sie eine davon wieder richtig beantworten, verschwindet sie aus dieser Liste. ${nachtrag}`,
  );
}

export function fehlerprotokollBauen(daten: Fehlerprotokolldaten): string {
  const form = { loesungZeigen: true, erklaerung: daten.tiefe } as const;

  const bloecke = daten.fragen.map((papier) => frageblock(papier, form, 3));

  return dokumentBauen({
    titel: 'Fehlerprotokoll Waffensachkunde',
    augenbraue: `${daten.profilName} · erstellt am ${datum(daten.erstelltAm)}`,
    quelle: daten.quelle,
    schriftgroesse: daten.schriftgroesse,
    abschnitte: [
      `<h2>Ihre offenen Fehler</h2>\n${vorspann(daten.fragen.length, daten.tiefe)}\n${bloecke.join('\n')}`,
    ],
  });
}

/** Vorschlag für den Dateinamen; enthält keine Zeichen, die Dateisysteme stören. */
export function fehlerprotokollDateiname(profilName: string, erstelltAm: string): string {
  const tag = Number.isNaN(Date.parse(erstelltAm))
    ? 'ohne-datum'
    : new Date(erstelltAm).toISOString().slice(0, 10);
  const name = profilName
    .normalize('NFKD')
    .replace(/[̀-ͯ]/gu, '')
    .replace(/[^A-Za-z0-9]+/gu, '-')
    .replace(/^-+|-+$/gu, '')
    .slice(0, 40);

  return `Fehlerprotokoll${name === '' ? '' : `-${name}`}-${tag}.pdf`;
}
