// tdd-guard:skip — this IS the test file for validate-form.ts
import { describe, it, expect } from 'vitest'
import { validateOeeForm } from '../validate-form'
import type { FormState } from '@/components/oee/oee-form-constants'
import { INITIAL_FORM } from '@/components/oee/oee-form-constants'

// Helper: build a fully-valid form
function validForm(): FormState {
  return {
    ...INITIAL_FORM,
    plantName: 'Werk 1',
    lineName: 'Linie A',
    taktMode: 'ideal',
    idealCycleTimeSec: '45',
    optimumTaktTimeSec: '',
    producedOutput: '750',
    goodOutput: '720',
    daysPerWeek: 5,
    hoursPerDay: 8,
    shiftsPerDay: 1,
  }
}

describe('validateOeeForm', () => {
  // ── All-valid ────────────────────────────────────────────────────────────
  it('returns empty array for a fully valid form (ideal mode)', () => {
    expect(validateOeeForm(validForm())).toEqual([])
  })

  it('returns empty array for a fully valid form (optimum mode)', () => {
    const form = { ...validForm(), taktMode: 'optimum' as const, idealCycleTimeSec: '', optimumTaktTimeSec: '50' }
    expect(validateOeeForm(form)).toEqual([])
  })

  // ── Missing required text fields ─────────────────────────────────────────
  it('flags missing plantName', () => {
    const errors = validateOeeForm({ ...validForm(), plantName: '' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'plantName', reason: 'missing' }]))
  })

  it('flags whitespace-only plantName as missing', () => {
    const errors = validateOeeForm({ ...validForm(), plantName: '   ' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'plantName', reason: 'missing' }]))
  })

  it('flags missing lineName', () => {
    const errors = validateOeeForm({ ...validForm(), lineName: '' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'lineName', reason: 'missing' }]))
  })

  it('flags whitespace-only lineName as missing', () => {
    const errors = validateOeeForm({ ...validForm(), lineName: '   ' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'lineName', reason: 'missing' }]))
  })

  // ── Active cycle-time — ideal mode ───────────────────────────────────────
  it('flags missing idealCycleTimeSec when taktMode=ideal', () => {
    const errors = validateOeeForm({ ...validForm(), idealCycleTimeSec: '' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'idealCycleTimeSec', reason: 'missing' }]))
  })

  it('flags zero idealCycleTimeSec as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), idealCycleTimeSec: '0' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'idealCycleTimeSec', reason: 'implausible' }]))
  })

  it('flags negative idealCycleTimeSec as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), idealCycleTimeSec: '-5' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'idealCycleTimeSec', reason: 'implausible' }]))
  })

  // ── Active cycle-time — optimum mode ─────────────────────────────────────
  it('flags missing optimumTaktTimeSec when taktMode=optimum', () => {
    const form: FormState = {
      ...validForm(),
      taktMode: 'optimum',
      idealCycleTimeSec: '',
      optimumTaktTimeSec: '',
    }
    const errors = validateOeeForm(form)
    expect(errors).toEqual(expect.arrayContaining([{ field: 'optimumTaktTimeSec', reason: 'missing' }]))
  })

  it('flags zero optimumTaktTimeSec as implausible', () => {
    const form: FormState = {
      ...validForm(),
      taktMode: 'optimum',
      idealCycleTimeSec: '',
      optimumTaktTimeSec: '0',
    }
    const errors = validateOeeForm(form)
    expect(errors).toEqual(expect.arrayContaining([{ field: 'optimumTaktTimeSec', reason: 'implausible' }]))
  })

  // Does NOT flag idealCycleTimeSec when taktMode=optimum (it's not the active field)
  it('does not flag empty idealCycleTimeSec when taktMode=optimum', () => {
    const form: FormState = {
      ...validForm(),
      taktMode: 'optimum',
      idealCycleTimeSec: '',
      optimumTaktTimeSec: '45',
    }
    const errors = validateOeeForm(form)
    const idealErrors = errors.filter(e => e.field === 'idealCycleTimeSec')
    expect(idealErrors).toHaveLength(0)
  })

  // ── producedOutput ────────────────────────────────────────────────────────
  it('flags missing producedOutput', () => {
    const errors = validateOeeForm({ ...validForm(), producedOutput: '' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'producedOutput', reason: 'missing' }]))
  })

  it('flags zero producedOutput as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), producedOutput: '0', goodOutput: '0' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'producedOutput', reason: 'implausible' }]))
  })

  it('flags negative producedOutput as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), producedOutput: '-10' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'producedOutput', reason: 'implausible' }]))
  })

  // ── goodOutput ────────────────────────────────────────────────────────────
  it('flags missing goodOutput', () => {
    const errors = validateOeeForm({ ...validForm(), goodOutput: '' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'goodOutput', reason: 'missing' }]))
  })

  it('flags goodOutput > producedOutput as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), producedOutput: '100', goodOutput: '101' })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'goodOutput', reason: 'implausible' }]))
  })

  it('accepts goodOutput === producedOutput (boundary)', () => {
    const errors = validateOeeForm({ ...validForm(), producedOutput: '100', goodOutput: '100' })
    const goodErrors = errors.filter(e => e.field === 'goodOutput')
    expect(goodErrors).toHaveLength(0)
  })

  it('accepts goodOutput < producedOutput', () => {
    const errors = validateOeeForm({ ...validForm(), producedOutput: '100', goodOutput: '80' })
    const goodErrors = errors.filter(e => e.field === 'goodOutput')
    expect(goodErrors).toHaveLength(0)
  })

  // ── Numeric defaults plausibility ─────────────────────────────────────────
  it('flags daysPerWeek=0 as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), daysPerWeek: 0 })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'daysPerWeek', reason: 'implausible' }]))
  })

  it('flags hoursPerDay=0 as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), hoursPerDay: 0 })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'hoursPerDay', reason: 'implausible' }]))
  })

  it('flags shiftsPerDay=0 as implausible', () => {
    const errors = validateOeeForm({ ...validForm(), shiftsPerDay: 0 })
    expect(errors).toEqual(expect.arrayContaining([{ field: 'shiftsPerDay', reason: 'implausible' }]))
  })

  // ── Multiple errors ───────────────────────────────────────────────────────
  it('returns multiple errors when several fields are invalid', () => {
    const form = validForm()
    const bad: FormState = { ...form, plantName: '', lineName: '', idealCycleTimeSec: '', producedOutput: '', goodOutput: '' }
    const errors = validateOeeForm(bad)
    expect(errors.length).toBeGreaterThanOrEqual(5)
  })

  // ── No errors on INITIAL_FORM with required fields filled ─────────────────
  it('produces errors on blank INITIAL_FORM (required fields missing)', () => {
    const errors = validateOeeForm(INITIAL_FORM)
    // plantName, lineName, idealCycleTimeSec, producedOutput, goodOutput are all blank
    expect(errors.length).toBeGreaterThanOrEqual(5)
  })
})
