// Hebel-Belege (KAR-840 V11 section 7, Abschluss der Hebel-Baustelle aus
// Loop 10 Modul 4/5): der letzte Rechenrest der Schale — leverInput-Aufbau
// samt Label-/Unsicherheits-Maps — wandert an die Build-Zeit, und jeder
// Hebel trägt seinen Zellbeleg.
//
// Muster wie die *-run.ts-Module: pures Builder-Modul, konsumiert die
// bereits gebauten A1-Zeilen-Specs aus buildManufacturingRun
// (deltas.rows) statt die vier Provenienz-Maps ein zweites Mal aus den
// Rohzeilen aufzubauen — Zell-Auflösung (altCell/neuCell, KAR-886/KAR-911)
// und Step-Label sind dort schon passiert.
//
// Beleg-Form: bewusst altCell/neuCell statt der formalen SourceRef-Form
// (view-specs.ts). qaf_manufacturing_diff/_step führen keine Formel und
// keinen Wertzustand — eine DifferenceCell wäre fabriziert (gleiche
// Begründung wie appendix-run.ts „Katalog-Beleg entstünde nur als Attrappe"
// und der manufacturing-run.ts-Kopf). Die A1-Zelladresse IST der Verweis
// in den Kern; fehlt sie (kein Match, älterer Lauf ohne source_cells),
// bleibt der Beleg ehrlich null statt erfunden.
//
// Unsicherheits-Semantik (Paritäts-Kante, nicht wegoptimieren): die Schale
// behandelte Diffs OHNE step_match_id als unsicher (uncertain: true —
// konservativ, ein Hebel ohne zuordenbaren Prozessschritt ist kein belastbares
// Verhandlungsargument). ManufacturingDeltaRowSpec.uncertain trägt für
// dieselben Zeilen false (die Deltas-Tabelle zeigt „unsicher" nur für echte
// unsichere Matches). Deshalb wird hier aus row.diff.step_match_id
// rekonstruiert, nicht row.uncertain durchgereicht.
//
// Die Hebel-Fachregel selbst (4-KPI-Katalog, 5-%-Schwelle, Forderungstexte)
// bleibt unverändert in levers.ts und wird hier nur AUFGERUFEN — pro Zeile
// einzeln, damit die Zeile→Hebel-Zuordnung ohne Duplikation der Filter-Logik
// und ohne Label-basierten Join feststeht (buildLevers ist elementweise
// unabhängig; der Äquivalenz-Pin zum Gesamtaufruf steht im Test).
//
// NICHT verwandt: negotiation-levers.ts (gleicher Funktionsname buildLevers,
// anderes Feature — regelbasierte Summary-Hebel, Kap. 7.9/R-20, ohne
// Produktiv-Aufrufer) und die V1-„Hebel-A/B"-Produktionsraten-Tabellen
// (production-view.ts). Beide bleiben unberührt.
//
// Pure Funktionen, keine I/O.

import {
  buildLevers,
  hasLeverKpiSignal,
  type Lever,
  type LeverDiffInput,
} from './levers'
import type { ManufacturingDeltaRowSpec } from './manufacturing-run'

export interface LeverSpec extends Lever {
  /** A1-Zellbeleg des KPI-Werts auf der ALT-Seite (source_cells des
   * gematchten Steps, KAR-886/KAR-911) — null ohne Match oder wenn der
   * Lauf vor der source_cells-Erfassung liegt. Ehrlicher Leerbeleg. */
  altCell: string | null
  neuCell: string | null
}

export interface LeversRun {
  levers: LeverSpec[]
  /** Prozess-KPIs verglichen, aber jedes Delta unter der 5-%-Schwelle —
   * unterscheidet „kein materieller Hebel" vom Platzhalter „keine
   * vergleichbaren Prozessschritte" (Bestand aus hasLeverKpiSignal). */
  belowThreshold: boolean
  anyUncertain: boolean
}

function leverInputFor(row: ManufacturingDeltaRowSpec): LeverDiffInput {
  return {
    stepLabel: row.stepLabelDe,
    field: row.diff.field,
    alt_value: row.diff.alt_value,
    neu_value: row.diff.neu_value,
    delta_percent: row.diff.delta_percent,
    uncertain: row.diff.step_match_id ? row.uncertain : true,
  }
}

export function buildLeversRun(
  rows: readonly ManufacturingDeltaRowSpec[],
): LeversRun {
  const inputs = rows.map(leverInputFor)
  const levers: LeverSpec[] = []
  rows.forEach((row, i) => {
    const [lever] = buildLevers([inputs[i]])
    if (lever) {
      levers.push({ ...lever, altCell: row.altCell, neuCell: row.neuCell })
    }
  })
  return {
    levers,
    belowThreshold: levers.length === 0 && hasLeverKpiSignal(inputs),
    anyUncertain: levers.some((l) => l.uncertain),
  }
}
