// Überschriften, die ihr Ergebnis tragen.
//
// Geprüft wird weniger die Formatierung als die Sprachregel: dass alle
// Abschnitte dieselbe Reihenfolge, dieselben Trennzeichen und dieselbe
// Behandlung des Sonderfalls „nichts verändert" benutzen. Genau daran hängt,
// ob eine Oberfläche wiedererkennbar wirkt oder nur ordentlich.
//
// FIXTURE-DATEN-REGEL: alle Zahlen unten sind frei erfunden.

import { describe, it, expect } from 'vitest'
import {
  actionTitle,
  countPhrase,
  deltaPhrase,
  severityPhrase,
  unchangedPhrase,
} from '../section-titles'

describe('Mengenänderung', () => {
  it('zeigt den Übergang, wenn sich die Zahl ändert', () => {
    expect(countPhrase({ from: 25, to: 31, nounDe: 'Stationen' })).toBe('25 → 31 Stationen')
  })

  it('nennt eine gleich gebliebene Zahl nur einmal', () => {
    // „31 → 31" deutet eine Veränderung an, die es nicht gab.
    expect(countPhrase({ from: 31, to: 31, nounDe: 'Stationen' })).toBe('31 Stationen')
  })

  it('trennt Tausender deutsch', () => {
    expect(countPhrase({ from: 1200, to: 1350, nounDe: 'Zeilen' })).toBe('1.200 → 1.350 Zeilen')
  })
})

describe('Delta', () => {
  it('setzt das Vorzeichen immer', () => {
    // Ohne Vorzeichen liest sich die Zahl wie ein Bestand statt wie eine
    // Veränderung — und die Richtung ist die Aussage.
    expect(deltaPhrase({ value: 2.4727, unit: 'EUR_per_piece' })).toBe('Δ +2,4727 EUR/Stück')
    expect(deltaPhrase({ value: -0.76, unit: 'EUR_per_piece' })).toBe('Δ −0,7600 EUR/Stück')
  })

  it('kürzt grosse Beträge', () => {
    expect(deltaPhrase({ value: 1_272_000, unit: 'EUR' })).toBe('Δ +1,27 Mio. EUR')
  })

  it('sagt es, wenn kein Delta ermittelbar ist', () => {
    // Nicht „Δ 0" — das wäre die Behauptung, es habe sich nichts geändert.
    expect(deltaPhrase({ value: null, unit: 'EUR' })).toBe('Δ nicht ermittelbar')
  })
})

describe('Befunde nach Schweregrad', () => {
  it('nennt die Lage vor dem Aufklappen', () => {
    expect(severityPhrase({ high: 4, medium: 5, low: 2 })).toBe('11 Befunde (4 hoch, 5 mittel, 2 niedrig)')
  })

  it('zählt die Hinweisstufe mit', () => {
    // Die Referenz führt vier Stufen; wer nur drei summiert, nennt eine
    // Gesamtzahl, die nicht zur Liste darunter passt.
    expect(severityPhrase({ high: 4, medium: 5, low: 2, info: 1 })).toBe(
      '12 Befunde (4 hoch, 5 mittel, 2 niedrig, 1 Hinweis)',
    )
  })

  it('lässt leere Stufen weg', () => {
    expect(severityPhrase({ high: 2 })).toBe('2 Befunde (2 hoch)')
  })

  it('sagt „keine Befunde" statt „0 Befunde"', () => {
    // Ein geprüfter Abschnitt ohne Befund ist ein Ergebnis, keine Null.
    expect(severityPhrase({})).toBe('keine Befunde')
  })
})

describe('Überschrift', () => {
  it('hängt die Fakten mit einheitlichem Trenner an', () => {
    const t = actionTitle('A1. Fertigung', [
      countPhrase({ from: 25, to: 31, nounDe: 'Stationen' }),
      deltaPhrase({ value: 2.4727, unit: 'EUR_per_piece' }),
    ])

    expect(t).toBe('A1. Fertigung — 25 → 31 Stationen · Δ +2,4727 EUR/Stück')
  })

  it('lässt fehlende Fakten weg, statt Lücken zu zeigen', () => {
    expect(actionTitle('A2. Struktur', [null, 'nichts', undefined, ''])).toBe('A2. Struktur — nichts')
  })

  it('steht ohne Zusatz da, wenn kein Fakt vorliegt', () => {
    // Ein Gedankenstrich, hinter dem nichts kommt, sieht nach Fehler aus.
    expect(actionTitle('A4. Plausibilität', [])).toBe('A4. Plausibilität')
    expect(actionTitle('A4. Plausibilität', [null, undefined])).toBe('A4. Plausibilität')
  })

  it('macht „nichts verändert" sichtbar', () => {
    // Ein geprüfter Abschnitt ohne Abweichung darf nicht aussehen wie ein
    // vergessener.
    const t = actionTitle('3. Kostenstruktur', [unchangedPhrase('Alle Buckets')])
    expect(t).toBe('3. Kostenstruktur — Alle Buckets unverändert')
  })
})
