import { describe, it, expect } from 'vitest'
import { computeTimeComposition, type TimeCompositionDatum } from '@/lib/lsc-workshop/time-composition'

describe('computeTimeComposition', () => {
  it('returns empty array when no data', () => {
    expect(computeTimeComposition([])).toEqual([])
  })

  it('aggregates machine + manual + waiting times per station', () => {
    const data: TimeCompositionDatum[] = [
      { step_id: 'a', step_number: 1, station_name: 'S1', machine_time_sec: 10, manual_time_sec: 5, waiting_time_sec: 2 },
      { step_id: 'a', step_number: 1, station_name: 'S1', machine_time_sec: 8, manual_time_sec: 3, waiting_time_sec: 1 },
    ]
    const result = computeTimeComposition(data)
    expect(result).toHaveLength(1)
    expect(result[0].machine).toBe(18)
    expect(result[0].manual).toBe(8)
    expect(result[0].waiting).toBe(3)
  })

  it('handles null values gracefully', () => {
    const data: TimeCompositionDatum[] = [
      { step_id: 'a', step_number: 1, station_name: 'S1', machine_time_sec: null, manual_time_sec: 5, waiting_time_sec: null },
    ]
    const result = computeTimeComposition(data)
    expect(result[0].machine).toBe(0)
    expect(result[0].manual).toBe(5)
    expect(result[0].waiting).toBe(0)
  })

  it('orders stations by step_number ascending', () => {
    const data: TimeCompositionDatum[] = [
      { step_id: 'c', step_number: 3, station_name: 'C', machine_time_sec: 1, manual_time_sec: 1, waiting_time_sec: 1 },
      { step_id: 'a', step_number: 1, station_name: 'A', machine_time_sec: 1, manual_time_sec: 1, waiting_time_sec: 1 },
      { step_id: 'b', step_number: 2, station_name: 'B', machine_time_sec: 1, manual_time_sec: 1, waiting_time_sec: 1 },
    ]
    const result = computeTimeComposition(data)
    expect(result.map((r) => r.step_id)).toEqual(['a', 'b', 'c'])
  })

  it('drops stations where all 3 times are zero/null', () => {
    const data: TimeCompositionDatum[] = [
      { step_id: 'empty', step_number: 1, station_name: 'E', machine_time_sec: null, manual_time_sec: 0, waiting_time_sec: null },
      { step_id: 'has', step_number: 2, station_name: 'H', machine_time_sec: 5, manual_time_sec: 0, waiting_time_sec: 0 },
    ]
    const result = computeTimeComposition(data)
    expect(result.map((r) => r.step_id)).toEqual(['has'])
  })
})
