// Der Referenzfall muss halten, was die Ansicht mit ihm behauptet.
//
// Diese Datei prüft nicht die Anzeigeebene — die ist nebenan geprüft. Sie prüft,
// dass die Eingaben in `reference-case.ts` durch die echten Bauer tatsächlich
// die beiden Zustände erzeugen, für die es die zwei Fälle gibt. Ohne sie könnte
// ein „schliesst nicht"-Fall unbemerkt schliessen (oder umgekehrt), und die
// Referenzansicht zeigte die Eigenschaft nicht mehr, für die sie da ist.

import { describe, it, expect } from 'vitest'
import {
  buildReferenceView,
  REFERENCE_CASES,
  REFERENCE_CASE_BROKEN,
  REFERENCE_CASE_OK,
} from '../reference-case'

describe('Referenzfall — der gute Zustand', () => {
  const view = buildReferenceView(REFERENCE_CASE_OK)

  it('schliesst und wird gezeichnet', () => {
    expect(view.waterfall.state).toBe('ok')
    // Start, vier Schritte, Ende.
    expect(view.waterfall.bars).toHaveLength(6)
  })

  it('trägt kein Banner, also ist die Zusammenfassung frei', () => {
    expect(view.validation.visible).toBe(false)
    expect(view.validation.summaryBlocked).toBe(false)
  })

  it('rechnet die Kacheln aus den Ständen statt sie zu setzen', () => {
    const preis = view.tiles.find((t) => t.key === 'stueckpreis')
    expect(preis?.deltaAbsolute).toBeCloseTo(1.07, 6)
    expect(preis?.deltaRatio).toBeCloseTo(1.07 / 2.46, 6)
    // 43 % Aufschlag: deutlich über der Kritisch-Schwelle.
    expect(preis?.status).toBe('critical')
  })

  it('gibt jeder Statusklasse einen Fall, sonst sieht man die Ampel nie ganz', () => {
    const stati = new Set(view.tiles.map((t) => t.status))
    expect(stati).toContain('warning')
    expect(stati).toContain('critical')
    expect(stati).toContain('good')
    expect(stati).toContain('neutral')
  })

  it('löst den Zellnachweis über beide Stände auf', () => {
    expect(view.evidence).toHaveLength(2)
    expect(view.evidence.map((e) => e.fileRole).sort()).toEqual(['award', 'current'])
    // Der Befund hängt am aktuellen Stand, nicht an der gleichnamigen Zelle
    // des Vergabestands.
    const aktuell = view.evidence.find((e) => e.fileRole === 'current')
    expect(aktuell?.findingIds).toContain('DQ-0007')
  })
})

describe('Referenzfall — der Zustand, für den das Modul gebaut wurde', () => {
  const view = buildReferenceView(REFERENCE_CASE_BROKEN)

  it('schliesst nicht und wird deshalb nicht gezeichnet', () => {
    expect(view.waterfall.state).toBe('not_reconciled')
    expect(view.waterfall.bars).toHaveLength(0)
    expect(view.waterfall.diagnosticsDe.length).toBeGreaterThan(0)
  })

  it('sperrt die Zusammenfassung sichtbar', () => {
    expect(view.validation.visible).toBe(true)
    expect(view.validation.summaryBlocked).toBe(true)
    expect(view.validation.messageDe).toContain('P-03')
  })

  it('unterscheidet sich vom guten Fall genau in einem Schritt', () => {
    // Sonst wäre unklar, ob der Unterschied vom fehlenden Schritt kommt oder
    // von irgendeiner anderen Abweichung zwischen den beiden Fällen.
    expect(REFERENCE_CASE_BROKEN.waterfall.steps).toHaveLength(
      REFERENCE_CASE_OK.waterfall.steps.length - 1,
    )
    expect(REFERENCE_CASE_OK.waterfall.start).toBe(REFERENCE_CASE_BROKEN.waterfall.start)
    expect(REFERENCE_CASE_OK.waterfall.end).toBe(REFERENCE_CASE_BROKEN.waterfall.end)
  })
})

describe('Alle Referenzfälle', () => {
  it('tragen erfundene Daten, keinen echten Abzug', () => {
    // Ein echter Lauf trüge Projekt- und Teilebezeichnungen. Diese Zusicherung
    // ist bewusst grob: sie kann keine Vertraulichkeit garantieren, aber sie
    // hält die offensichtliche Regression auf.
    for (const fall of REFERENCE_CASES) {
      expect(fall.partLabelDe).toMatch(/Muster/)
      for (const datei of fall.files) {
        expect(datei.nameDe).toMatch(/muster/)
      }
    }
  })

  it('haben eindeutige Schlüssel', () => {
    const keys = REFERENCE_CASES.map((f) => f.key)
    expect(new Set(keys).size).toBe(keys.length)
  })
})
