// Ansicht-Partition (PO-Feedback 10.08.2026) — Sichtbarkeitsregeln.
import { describe, it, expect } from 'vitest'
import type { DifferenceRecord } from '../all-differences'
import { partitionDifferenceRecords, PARTITION_DELTA_TOLERANCE } from '../record-partition'

function rec(overrides: Partial<DifferenceRecord>): DifferenceRecord {
  return {
    differenceId: 'D-TST-001',
    area: 'MFG',
    kind: 'changed',
    formulaFindingKind: null,
    descriptionDe: 'Testsatz',
    valueAward: 1,
    valueCurrent: 1,
    delta: 0,
    deltaNullReason: null,
    unit: 'EUR',
    cells: [],
    relatedDq: [],
    anchorRow: 1,
    ...overrides,
  }
}

describe('partitionDifferenceRecords', () => {
  it('keeps structural kinds in the main table even with delta null (added/removed are real differences)', () => {
    const p = partitionDifferenceRecords([
      rec({ kind: 'added', delta: null }),
      rec({ kind: 'removed', delta: null }),
      rec({ kind: 'renamed', delta: 0 }),
    ])
    expect(p.wertOderStruktur).toHaveLength(3)
    expect(p.ohneWertaenderung).toHaveLength(0)
    expect(p.formelOhneWertaenderung).toHaveLength(0)
  })

  it('keeps named delta gaps visible (deltaNullReason is a finding, not noise)', () => {
    const p = partitionDifferenceRecords([rec({ delta: null, deltaNullReason: 'nicht_berechenbar' })])
    expect(p.wertOderStruktur).toHaveLength(1)
  })

  it('groups formula findings with unchanged value separately — never into „unverändert" (Master-Prompt §12.4)', () => {
    const p = partitionDifferenceRecords([
      rec({ formulaFindingKind: 'formel_geaendert_wert_gleich', delta: 0 }),
    ])
    expect(p.formelOhneWertaenderung).toHaveLength(1)
    expect(p.ohneWertaenderung).toHaveLength(0)
  })

  it('keeps a formula finding WITH a real value change in the main table (doubly relevant)', () => {
    const p = partitionDifferenceRecords([
      rec({ formulaFindingKind: 'formel_zu_konstante', delta: 12.5 }),
    ])
    expect(p.wertOderStruktur).toHaveLength(1)
    expect(p.formelOhneWertaenderung).toHaveLength(0)
  })

  it('folds plain changed rows within tolerance into „ohne Wertänderung" and keeps real deltas visible', () => {
    const p = partitionDifferenceRecords([
      rec({ delta: 0 }),
      rec({ delta: PARTITION_DELTA_TOLERANCE }),
      rec({ delta: -0.004 }),
      rec({ delta: 0.02 }),
      rec({ delta: -3.5 }),
    ])
    expect(p.ohneWertaenderung).toHaveLength(3)
    expect(p.wertOderStruktur).toHaveLength(2)
  })

  it('every record lands in exactly one partition (nothing vanishes, nothing duplicates)', () => {
    const records = [
      rec({ kind: 'added', delta: null }),
      rec({ formulaFindingKind: 'formel_geaendert_wert_gleich', delta: 0 }),
      rec({ delta: 0 }),
      rec({ delta: 7 }),
      rec({ delta: null, deltaNullReason: 'blockiert' }),
    ]
    const p = partitionDifferenceRecords(records)
    expect(p.wertOderStruktur.length + p.formelOhneWertaenderung.length + p.ohneWertaenderung.length).toBe(
      records.length,
    )
  })
})
