/**
 * Wie dick wird das Dokument? – die Schätzung, die vor dem Speichern dasteht.
 *
 * ## Warum das überhaupt nötig ist
 *
 * Der schlimmste gemessene Fall sind **982 Seiten**: 486 Fragen mit voller
 * Begründung im Großdruck. Wer das ohne Vorwarnung an einen Drucker schickt,
 * hat ein Problem. Die Zahl muss deshalb dastehen, bevor der Speicherdialog
 * aufgeht.
 *
 * ## Warum die Stützstellen gemessen sind und nicht gerechnet
 *
 * Der erste Anlauf schätzte über eine Faustregel („rund 3000 Zeichen je
 * A4-Seite“). Nachgemessen an wirklich gedruckten PDF lag sie um **Faktor
 * 1,7 bis 2,8 zu niedrig** – die Fragenliste über den ganzen Katalog wurde
 * mit 55 Seiten angekündigt und hatte 162. Eine Anzeige, die zugunsten des
 * Nutzers irrt, ist genauso falsch wie eine, die gegen ihn irrt.
 *
 * Die Werte unten stammen deshalb aus Dokumenten, die mit demselben
 * Stylesheet gebaut und mit echtem Chromium gedruckt wurden. Gezählt wurden
 * die Seitenobjekte im PDF, nicht der erste Knoten des Seitenbaums – dieser
 * Griff liefert bei jedem Dokument über acht Seiten die Zahl 8.
 *
 * ## Was die Zahl nicht ist
 *
 * Eine Zusage. Die Länge hängt daran, welche Fragen es trifft; eine Frage mit
 * Abbildung und langer Begründung braucht ein Mehrfaches einer Ja/Nein-Frage.
 * Die Oberfläche sagt deshalb „geschätzt etwa“ und nennt keine Nachkommastelle.
 */

import type { Schriftgroesse } from './stil';

/**
 * Gemessene Stützstellen, Seiten je Frage bei Schriftgröße „normal“.
 *
 * | Dokument | gemessen | Seiten |
 * |---|---|---|
 * | Fehlerprotokoll, Kurzerklärung | 150 Fragen | 70 |
 * | Fehlerprotokoll, volle Begründung | 150 Fragen | 169 |
 * | Fehlerprotokoll, volle Begründung | 486 Fragen | 539 |
 * | Fragenliste | 575 Fragen | 162 |
 * | Fragenliste mit Lösungsanhang | 575 Fragen | 185 |
 */
const JE_FRAGE = Object.freeze({
  fehlerKurz: 0.47,
  fehlerVoll: 1.1,
  fragenliste: 0.28,
  /** Der Lösungsanhang kostet zusätzlich – 23 Seiten auf 575 Fragen. */
  loesungsanhang: 0.04,
});

/** Vorspann, Quellenblock und Überschriften – unabhängig von der Fragenzahl. */
const GRUNDLAST = 2;

/**
 * Großdruck gegen Normalgröße, gemessen.
 *
 * 162 gegen 279 Seiten bei derselben Fragenliste; beim Fehlerprotokoll mit
 * voller Begründung 508 gegen 982. Der Faktor schwankt zwischen 1,7 und 1,9;
 * genommen wird der obere Wert, damit die Schätzung eher zu hoch als zu
 * niedrig ausfällt.
 */
const GROSSDRUCK = 1.9;

function runden(seiten: number): number {
  return Math.max(1, Math.round(seiten));
}

/** Geschätzte Seitenzahl des Fehlerprotokolls. */
export function seitenFehlerprotokoll(
  fragen: number,
  tiefe: 'kurz' | 'voll',
  schriftgroesse: Schriftgroesse,
): number {
  if (fragen === 0) {
    return 1;
  }
  const roh = GRUNDLAST + fragen * (tiefe === 'voll' ? JE_FRAGE.fehlerVoll : JE_FRAGE.fehlerKurz);
  return runden(schriftgroesse === 'gross' ? roh * GROSSDRUCK : roh);
}

/** Geschätzte Seitenzahl der Fragenliste. */
export function seitenFragenliste(
  fragen: number,
  mitLoesungen: boolean,
  schriftgroesse: Schriftgroesse,
): number {
  if (fragen === 0) {
    return 1;
  }
  const roh =
    GRUNDLAST + fragen * (JE_FRAGE.fragenliste + (mitLoesungen ? JE_FRAGE.loesungsanhang : 0));
  return runden(schriftgroesse === 'gross' ? roh * GROSSDRUCK : roh);
}

/**
 * Der Satz, der vor dem Speichern dasteht.
 *
 * Nennt Blatt **und** Seiten: Wer druckt, denkt in Blättern, und beidseitig
 * ist die Hälfte. 982 Seiten sind 491 Blatt – erst diese Zahl macht klar,
 * worum es geht.
 */
export function umfangssatz(seiten: number): string {
  const blatt = Math.ceil(seiten / 2);
  if (seiten === 1) {
    return 'Geschätzt eine Seite.';
  }
  return (
    `Geschätzt etwa ${String(seiten)} Seiten – beidseitig gedruckt rund ${String(blatt)} Blatt. ` +
    'Die genaue Länge hängt davon ab, welche Fragen es trifft.'
  );
}
