// Weg des Datei-Labels vom Parser bis in die Anzeige (V2 R-04, Befund F-02).
//
// Der Parser kennt seit KAR-996 das Label, das wirklich in der Datei steht.
// Diese Tests decken die Strecke danach ab: durch den Diff, in die Persistenz,
// und in die Metriktabelle — denn genau dort war die falsche Beschriftung
// sichtbar: das Zoll-Label des Preisblocks auf einer Zeile, die "JIS" heißt.

import { describe, it, expect } from 'vitest'
import { gridFromCells } from '../summary-parser'
import { parseSummaryMetrics, diffSummaryMetrics } from '../summary-metrics'
import { buildSummaryMetricRows } from '../persistence-mapper'
import { buildMetricsTable, type SummaryDiffRowData } from '../summary-view'

/** Legacy-Preisblock; Werte synthetisch, Zeilenlagen wie im Template. */
function grid(overrides: Record<string, unknown> = {}) {
  return gridFromCells({
    C26: 'EUR',
    N10: 'EUR',
    G11: 'Materialkosten',
    N11: 300,
    G29: 'ANGEBOTSPREIS*',
    N29: 355.05,
    ...overrides,
  })
}

describe('buildSummaryMetricRows — Label je Datei persistieren', () => {
  const ctx = { projectId: 'p', fileId: 'f', partNumber: null }

  it('schreibt das bestätigte Datei-Label mit', () => {
    const parse = parseSummaryMetrics(grid(), 'Zusammenfassung')
    const row = buildSummaryMetricRows(ctx, parse).find((r) => r.metric_key === 'materialCosts')!

    expect(row.label_file).toBe('Materialkosten')
    expect(row.label_verified).toBe(true)
  })

  it('schreibt ein abweichendes Label als nicht bestätigt mit (F-02)', () => {
    const parse = parseSummaryMetrics(grid({ G27: 'JIS', N27: 0.76 }), 'Zusammenfassung')
    const row = buildSummaryMetricRows(ctx, parse).find((r) => r.metric_key === 'customsSupplierToBMW')!

    expect(row.label_file).toBe('JIS')
    expect(row.label_verified).toBe(false)
  })

  it('schreibt für strukturell labellose Zeilen null statt false', () => {
    const parse = parseSummaryMetrics(grid({ G18: 'Ausschusskosten', N18: 0.2, N19: 0.05 }), 'Zusammenfassung')
    const row = buildSummaryMetricRows(ctx, parse).find((r) => r.metric_key === 'scrapManufacturing')!

    expect(row.label_file).toBeNull()
    expect(row.label_verified).toBeNull()
  })
})

describe('diffSummaryMetrics — beide Seiten getrennt führen', () => {
  it('trägt Label und Verifikation je Seite', () => {
    const alt = parseSummaryMetrics(grid({ G27: 'JIS', N27: 0.76 }), 'Zusammenfassung')
    const neu = parseSummaryMetrics(grid({ G27: 'JIS-Zuschlag', N27: 0.9 }), 'Zusammenfassung')
    const d = diffSummaryMetrics(alt, neu).find((x) => x.metricKey === 'customsSupplierToBMW')!

    expect(d.labelFileAlt).toBe('JIS')
    expect(d.labelFileNeu).toBe('JIS-Zuschlag')
    expect(d.labelVerifiedAlt).toBe(false)
    expect(d.labelVerifiedNeu).toBe(false)
  })
})

describe('buildMetricsTable — Anzeige folgt der Datei, nicht der Konfiguration', () => {
  function row(over: Partial<SummaryDiffRowData> & { metric_key: string }): SummaryDiffRowData {
    return {
      alt_value: 1,
      neu_value: 2,
      delta_absolute: 1,
      delta_percent: 1,
      currency: 'EUR',
      status: 'anstieg',
      source_alt: 'P27',
      source_neu: 'P27',
      label_file_alt: null,
      label_file_neu: null,
      label_verified_alt: null,
      label_verified_neu: null,
      ...over,
    }
  }

  it('zeigt das Label der Datei statt des Konfigurations-Labels (F-02)', () => {
    const table = buildMetricsTable([
      row({ metric_key: 'customsSupplierToBMW', label_file_neu: 'JIS', label_verified_neu: false }),
    ])
    const block7 = table.find((r) => r.metricKey === 'customsSupplierToBMW')!

    expect(block7.label).toBe('JIS')
    expect(block7.labelVerified).toBe(false)
  })

  it('nimmt das Label der Vergabe-Seite, wenn die aktuelle Datei keines trägt', () => {
    const table = buildMetricsTable([row({ metric_key: 'customsSupplierToBMW', label_file_alt: 'JIS' })])
    expect(table.find((r) => r.metricKey === 'customsSupplierToBMW')!.label).toBe('JIS')
  })

  it('fällt ohne Datei-Label auf das Registry-Label zurück', () => {
    const table = buildMetricsTable([row({ metric_key: 'materialCosts' })])
    expect(table.find((r) => r.metricKey === 'materialCosts')!.label).toBe('Materialkosten')
  })

  it('zeigt für eine Zeile ganz ohne Daten das Registry-Label und keine Unsicherheit', () => {
    // Schnittstelle zwischen zwei Änderungen: seit R-22 führt die Tabelle auch
    // Zeilen ohne persistierte Daten. Für die gibt es kein Datei-Label — sie
    // dürfen weder leer beschriftet noch als „nicht verifiziert" markiert
    // werden, denn geprüft wurde dort gar nichts.
    const table = buildMetricsTable([row({ metric_key: 'materialCosts' })])
    const untouched = table.find((r) => r.metricKey === 'transportSupplierToBMW')!

    expect(untouched.present).toBe(false)
    expect(untouched.label).toBe('Transport Lieferant → BMW') // allow-customer-string
    expect(untouched.labelVerified).toBeNull()
  })

  it('meldet keine Unsicherheit, wo das Label bestätigt ist', () => {
    const table = buildMetricsTable([
      row({ metric_key: 'materialCosts', label_file_neu: 'Materialkosten', label_verified_neu: true }),
    ])
    expect(table.find((r) => r.metricKey === 'materialCosts')!.labelVerified).toBe(true)
  })
})
