import { describe, it, expect } from 'vitest'
import { buildLevers, hasLeverKpiSignal, LEVER_KPI_DEFS } from '../levers'

function diff(stepLabel: string, field: string, alt: number, neu: number, uncertain = false) {
  return {
    stepLabel,
    field,
    alt_value: alt,
    neu_value: neu,
    delta_percent: alt !== 0 ? (neu - alt) / Math.abs(alt) : null,
    uncertain,
  }
}

describe('buildLevers', () => {
  it('derives a lever with the fixed ask for each KPI delta ≥5% (V11 rule)', () => {
    const levers = buildLevers([
      diff('2 Schweissen', 'zykluszeit', 10, 12), // +20 %
      diff('2 Schweissen', 'mss', 50, 51), // +2 % → below threshold
      diff('1 Montage', 'lohnkosten', 30, 25), // −16,7 %
    ])
    expect(levers).toHaveLength(2)
    const zyk = levers.find((l) => l.kpiLabel === 'Zykluszeit')!
    expect(zyk.stepLabel).toBe('2 Schweissen')
    expect(zyk.deltaPercent).toBeCloseTo(0.2)
    expect(zyk.ask).toContain('technisch begründen')
    const lohn = levers.find((l) => l.kpiLabel === 'Lohnkosten')!
    expect(lohn.ask).toContain('Standort-Benchmark')
  })

  it('ignores non-KPI fields and null deltas', () => {
    const levers = buildLevers([
      diff('1 Montage', 'fk', 100, 200),
      { stepLabel: '1 Montage', field: 'mss', alt_value: 0, neu_value: 5, delta_percent: null, uncertain: false },
    ])
    expect(levers).toEqual([])
  })

  it('carries the uncertain-match flag through to the lever', () => {
    const levers = buildLevers([diff('2 Schweissen', 'mss', 50, 60, true)])
    expect(levers[0].uncertain).toBe(true)
  })

  it('covers all four V11 KPI defs with asks', () => {
    expect(LEVER_KPI_DEFS.map((d) => d.field)).toEqual(['zykluszeit', 'mss', 'lohnkosten', 'anzahlMA'])
    expect(LEVER_KPI_DEFS.every((d) => d.ask.length > 10)).toBe(true)
  })
})

describe('hasLeverKpiSignal', () => {
  it('distinguishes "steps compared, deltas small" from "no step data"', () => {
    expect(hasLeverKpiSignal([diff('1 Montage', 'mss', 50, 51)])).toBe(true) // 2 % — below lever threshold
    expect(hasLeverKpiSignal([diff('1 Montage', 'fk', 100, 200)])).toBe(false) // no KPI field
    expect(hasLeverKpiSignal([])).toBe(false)
  })
})
