// Loop 4: abgeleitete Vergleichbarkeits-Ampel — Positiv-, Negativ-,
// Gegen- und (per Skript-Lauf) Mutations-Proben laut Exit-Kriterium.
import { describe, it, expect } from 'vitest'
import { deriveComparability } from '../comparability'

const issue = (issue_type: string) => ({ issue_type })

describe('deriveComparability', () => {
  it('positive: part_number_mismatch dominates everything → not_comparable with the reason', () => {
    const d = deriveComparability([issue('supplier_mismatch'), issue('part_number_mismatch')])
    expect(d.status).toBe('not_comparable')
    expect(d.reasonsDe[0]).toContain('Sachnummern')
  })

  it('positive: each identity-limiting type alone → limited, reason names the field', () => {
    for (const [t, wort] of [
      ['supplier_mismatch', 'Lieferant'],
      ['supplier_no_mismatch', 'Lieferantennummer'],
      ['variant_changed', 'Variante'],
    ] as const) {
      const d = deriveComparability([issue(t)])
      expect(d.status).toBe('limited')
      expect(d.reasonsDe.join(' ')).toContain(wort)
    }
  })

  it('negative: no issues at all → comparable, with the honest bounded reason', () => {
    const d = deriveComparability([])
    expect(d.status).toBe('comparable')
    expect(d.reasonsDe[0]).toContain('Keine Identitäts-Befunde')
  })

  it('counter-probe: hint-level types must NOT move the traffic light', () => {
    const d = deriveComparability([
      issue('request_version_changed'),
      issue('change_index_changed'),
      issue('quotation_date_order'),
      issue('filename_part_number_mismatch'),
      issue('part_name_changed'),
      issue('voellig_unbekannter_typ'),
    ])
    expect(d.status).toBe('comparable')
  })

  it('deduplicates repeated limited findings into one reason each', () => {
    const d = deriveComparability([issue('supplier_mismatch'), issue('supplier_mismatch')])
    expect(d.status).toBe('limited')
    expect(d.reasonsDe).toHaveLength(1)
  })

  it('mixed limited + hint types: hints must not pollute the limited reasons', () => {
    const d = deriveComparability([issue('supplier_mismatch'), issue('request_version_changed')])
    expect(d.status).toBe('limited')
    expect(d.reasonsDe).toHaveLength(1)
    expect(d.reasonsDe[0]).toContain('Lieferant')
  })

  it('two distinct limited types produce one reason each', () => {
    const d = deriveComparability([issue('supplier_mismatch'), issue('variant_changed')])
    expect(d.status).toBe('limited')
    expect(d.reasonsDe).toHaveLength(2)
  })

  it('incomplete identity checks (pre-D16 run): comparable, but the reason names the gap', () => {
    const d = deriveComparability([], { identityChecksComplete: false })
    expect(d.status).toBe('comparable')
    expect(d.reasonsDe[0]).toContain('vor den erweiterten Identitätsprüfungen')
  })

  it('reasons are never empty (the lamp always carries its justification)', () => {
    expect(deriveComparability([]).reasonsDe.length).toBeGreaterThan(0)
    expect(deriveComparability([issue('part_number_mismatch')]).reasonsDe.length).toBeGreaterThan(0)
  })
})
