// KAR-959/P2 §33-L1 real-file validation — BESTANDSSUITE, env-gated.
//
// Enthält die beiden Familien, die der Product Owner am 2026-08-04 als
// `deferred_by_product_owner` festgelegt hat:
//
//   1. G60-Detail  — eigene Pipeline (`internal/g60/`), strukturell AUSSERHALB
//                    des Geltungsbereichs dieser 8-Modul-Matrix
//   2. Multi-QAF   — Variantenstruktur ist die Domäne von `internal/multi-qaf/`,
//                    nicht dieser Matrix
//
// **Warum getrennt und nicht gelöscht.** Die Festlegung lautet: nicht
// erweitern, nicht refactoren, nicht als Exit-Kriterium verwenden — aber der
// Bestand darf sich auch nicht verschlechtern. Beides zugleich geht nur, wenn
// die Prüfungen weiterlaufen und trotzdem sichtbar nicht zur Abnahme gehören.
// Deshalb: unveränderte Zusicherungen, eigene Datei, dieser Kopf.
//
// **Warum hier keine Mindestschranke steht.** Die Kernabnahme daneben verlangt,
// dass mindestens eine ihrer vier Familien im Korpus vorkommt — sonst wäre ein
// grüner Lauf ohne jede Prüfung möglich. Hier wäre dieselbe Schranke falsch:
// G60_DETAIL macht laut capability-matrix.md unter 1 % des vollen 374-Dateien-
// Korpus aus, ein lokaler Ausschnitt enthält also nicht zwingend einen. Eine
// Schranke würde aus einer zurückgestellten Familie ein Abnahmekriterium
// machen — genau das, was die Festlegung ausschließt. Ein fehlender
// Repräsentant ist deshalb ein sichtbares `skip` mit Grund, kein Fehlschlag.
//
// VERTRAULICHKEIT (KAR-926 F2): hier steht NIEMALS ein realer Dateiname als
// Quelltext-Literal. Jeder Repräsentant wird zur Laufzeit über seine
// Klassifikation gefunden. Begründung im Kopf von `real-corpus.ts`.
//
// tdd-guard:skip — real-file regression/observation test, not a unit-level
// behavior spec.

import { describe, expect, it } from 'vitest'
import { summarizeCoverage } from '../module-capability-resolver'
import {
  SUITE_TIMEOUT_MS,
  berichtszeile,
  classifyCorpusOnce,
  computeMatrixFor,
  corpusVorhanden,
  assertStructurallyPlausible,
  type ClassifiedFile,
} from './real-corpus'

describe.skipIf(!corpusVorhanden())(
  'WorkbookCapabilityDetector — real-file validation, deferred_by_product_owner (KAR-959/P2, §33-L1, env-gated)',
  () => {
    const repraesentant = async (
      waehle: (alle: ClassifiedFile[]) => ClassifiedFile | undefined,
    ): Promise<ClassifiedFile | undefined> => (corpusVorhanden() ? waehle(await classifyCorpusOnce()) : undefined)

    it(
      'G60-Detail: die Matrix meldet nichts fälschlich als verfügbar, der INPUT-Reiter bleibt als Blattrolle erhalten',
      async (ctx) => {
        const datei = await repraesentant((alle) => alle.find((c) => c.isG60))
        if (!datei) return ctx.skip('keine G60-Detail-Mappe in diesem Korpusausschnitt (unter 1 % des vollen Korpus — erwartbar)')

        const ergebnis = await computeMatrixFor(datei.fullPath)
        assertStructurallyPlausible(ergebnis.matrix, ergebnis.sheetNames.length, ergebnis.sheetNames, ergebnis.facetSignals)
        const coverage = summarizeCoverage(ergebnis.matrix)
        console.log(berichtszeile('G60-Detail', datei.fullPath, ergebnis, coverage))

        // G60 is structurally OUT OF SCOPE for this 8-module matrix (types.ts
        // CAPABILITY_MODULES doc) — its numbered detail tabs carry no
        // MANUFACTURING/MATERIAL/... sheet-name signal, so the matrix is
        // expected to be dominated by MISSING, never falsely AVAILABLE. The
        // resolver still classifies the G60 INPUT rate-card sheet by SheetRole
        // (not a capability module) — sheets are never silently dropped even
        // when no module claims them.
        expect(coverage.available).toBe(0)
        expect(ergebnis.matrix.sheetRoles.some((r) => r.role === 'input')).toBe(true)
      },
      SUITE_TIMEOUT_MS,
    )

    it(
      'Multi-QAF: kein Absturz, SUMMARY wird weiterhin klassifiziert',
      async (ctx) => {
        const datei = await repraesentant((alle) =>
          alle.find((c) => c.multiQafClassification === 'confirmed_multi_qaf' || c.multiQafClassification === 'probable_multi_qaf'),
        )
        if (!datei) return ctx.skip('keine als confirmed/probable_multi_qaf klassifizierte Mappe in diesem Korpusausschnitt')

        const ergebnis = await computeMatrixFor(datei.fullPath)
        assertStructurallyPlausible(ergebnis.matrix, ergebnis.sheetNames.length, ergebnis.sheetNames, ergebnis.facetSignals)
        console.log(berichtszeile('Multi-QAF', datei.fullPath, ergebnis, summarizeCoverage(ergebnis.matrix)))

        // Variant structure itself is multi-qaf/'s domain, not this matrix's —
        // the only claim here is "does not crash and still classifies SUMMARY",
        // matching the module header.
        expect(ergebnis.matrix.modules.find((m) => m.module === 'SUMMARY')).toBeDefined()
      },
      SUITE_TIMEOUT_MS,
    )
  },
)
