// Tests for lib/lsc/observed-ct.ts — auto-sum of observed cycle time from
// sub-times. Regression coverage for the stale-auto-sum bug: after the first
// sub-time auto-set observed_ct, later sub-time edits no longer updated it.

import { describe, it, expect } from 'vitest'
import { nextObservedCt, subTimeSum, type SubTimes } from '../observed-ct'

const times = (overrides: Partial<SubTimes> = {}): SubTimes => ({
  machine_time_sec: null,
  value_add_time_sec: null,
  non_va_time_sec: null,
  load_unload_time_sec: null,
  ...overrides,
})

describe('subTimeSum', () => {
  it('sums all sub-times, treating null as 0', () => {
    expect(subTimeSum(times({ machine_time_sec: 30, value_add_time_sec: 15 }))).toBe(45)
  })

  it('returns 0 when nothing is set', () => {
    expect(subTimeSum(times())).toBe(0)
  })
})

describe('nextObservedCt', () => {
  it('auto-sets observed CT on first sub-time entry', () => {
    const prev = times()
    const next = times({ machine_time_sec: 30 })
    expect(nextObservedCt(null, prev, next)).toBe(30)
  })

  it('keeps following the sum on later sub-time entries (stale-bug regression)', () => {
    // First entry auto-set observed CT to 30; the second entry must move it to 45.
    const prev = times({ machine_time_sec: 30 })
    const next = times({ machine_time_sec: 30, value_add_time_sec: 15 })
    expect(nextObservedCt(30, prev, next)).toBe(45)
  })

  it('does not touch a manually entered observed CT', () => {
    // User typed 50 (≠ previous sum of 30), then edits a sub-time.
    const prev = times({ machine_time_sec: 30 })
    const next = times({ machine_time_sec: 30, value_add_time_sec: 15 })
    expect(nextObservedCt(50, prev, next)).toBe(50)
  })

  it('does not auto-set when the new sum is 0', () => {
    const prev = times({ machine_time_sec: 30 })
    const next = times({ machine_time_sec: null })
    expect(nextObservedCt(30, prev, next)).toBe(30)
  })

  it('re-attaches when a manual value is cleared', () => {
    const prev = times({ machine_time_sec: 30 })
    const next = times({ machine_time_sec: 30, value_add_time_sec: 15 })
    expect(nextObservedCt(null, prev, next)).toBe(45)
  })
})
