import { describe, it, expect } from 'vitest'
import {
  validatePromoteInput,
  mapIntakeTypeToProjectTypeCode,
  deriveKifagDepartmentPrefix,
  type IntakeForPromote,
  type PromoteFormInput,
} from '@/lib/intake/promote'

const BASE_INTAKE: IntakeForPromote = {
  id: 'i1',
  status: 'review',
  intake_id: 'A-2026-001',
  intake_type: 'lsc_workshop',
  supplier_id: 'sup-1',
  supplier_name_freetext: null,
  supplier_plant_location: null,
  project_lead: 'Müller',
  delivery_scope: 'Test',
  requesting_department: 'MO-23',
  product_line: null,
  vehicle_project: null,
  order_reason: null,
  order_objective: null,
  preferred_first_visit_start: '2026-06-01',
  preferred_first_visit_end: '2026-06-03',
}

const BASE_INPUT: PromoteFormInput = {
  consultantId: 'c-1',
  erstbesuchStart: '2026-06-01',
  erstbesuchEnd: '2026-06-03',
  supplierNameOverride: null,
  plantLocationOverride: null,
}

describe('promote — validatePromoteInput', () => {
  it('accepts a complete review-intake with supplier_id', () => {
    expect(validatePromoteInput(BASE_INTAKE, BASE_INPUT).ok).toBe(true)
  })

  it('accepts a backlog-intake', () => {
    expect(validatePromoteInput({ ...BASE_INTAKE, status: 'backlog' }, BASE_INPUT).ok).toBe(true)
  })

  it('rejects promote from draft / promoted / rejected / archived', () => {
    for (const s of ['draft', 'promoted', 'rejected', 'archived'] as const) {
      const r = validatePromoteInput({ ...BASE_INTAKE, status: s }, BASE_INPUT)
      expect(r.ok).toBe(false)
      if (!r.ok) expect(r.error).toBe('intake_not_promotable_status')
    }
  })

  it('requires consultant_id', () => {
    const r = validatePromoteInput(BASE_INTAKE, { ...BASE_INPUT, consultantId: '' })
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error).toBe('consultant_required')
  })

  it('requires erstbesuch dates', () => {
    expect(
      validatePromoteInput(BASE_INTAKE, { ...BASE_INPUT, erstbesuchStart: '' }).ok,
    ).toBe(false)
    expect(
      validatePromoteInput(BASE_INTAKE, { ...BASE_INPUT, erstbesuchEnd: '' }).ok,
    ).toBe(false)
  })

  it('rejects end before start', () => {
    const r = validatePromoteInput(BASE_INTAKE, {
      ...BASE_INPUT,
      erstbesuchStart: '2026-06-10',
      erstbesuchEnd: '2026-06-05',
    })
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error).toBe('erstbesuch_end_before_start')
  })

  it('requires supplier when no supplier_id and no freetext and no override', () => {
    const r = validatePromoteInput(
      { ...BASE_INTAKE, supplier_id: null, supplier_name_freetext: null },
      BASE_INPUT,
    )
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error).toBe('supplier_required')
  })

  it('accepts supplier override when no supplier_id and no freetext', () => {
    const r = validatePromoteInput(
      { ...BASE_INTAKE, supplier_id: null, supplier_name_freetext: null },
      { ...BASE_INPUT, supplierNameOverride: 'BMW Lieferant GmbH' },
    )
    expect(r.ok).toBe(true)
  })

  it('accepts supplier_name_freetext when no supplier_id', () => {
    const r = validatePromoteInput(
      { ...BASE_INTAKE, supplier_id: null, supplier_name_freetext: 'Freitext-Lieferant' },
      BASE_INPUT,
    )
    expect(r.ok).toBe(true)
  })
})

describe('promote — intake_type → project_type_code mapping', () => {
  it('maps lsc_workshop and fabrikanalyse 1:1', () => {
    expect(mapIntakeTypeToProjectTypeCode('lsc_workshop')).toBe('lsc_workshop')
    expect(mapIntakeTypeToProjectTypeCode('fabrikanalyse')).toBe('fabrikanalyse')
  })

  it('returns null for intake types without project_type counterpart', () => {
    expect(mapIntakeTypeToProjectTypeCode('lieferantenbefaehigung')).toBeNull()
    expect(mapIntakeTypeToProjectTypeCode('invest_workshop')).toBeNull()
    expect(mapIntakeTypeToProjectTypeCode('sonderprojekt')).toBeNull()
    expect(mapIntakeTypeToProjectTypeCode('sonstiges')).toBeNull()
  })

  it('returns null for missing or unknown values', () => {
    expect(mapIntakeTypeToProjectTypeCode(null)).toBeNull()
    expect(mapIntakeTypeToProjectTypeCode('something_else')).toBeNull()
  })
})

describe('promote — kifag department prefix', () => {
  it('extracts prefix before the dash', () => {
    expect(deriveKifagDepartmentPrefix('MO-23')).toBe('MO')
    expect(deriveKifagDepartmentPrefix('MO-24')).toBe('MO')
    expect(deriveKifagDepartmentPrefix('MN-14')).toBe('MN')
    expect(deriveKifagDepartmentPrefix('MN-90')).toBe('MN')
    expect(deriveKifagDepartmentPrefix('MC-14')).toBe('MC')
  })

  it('returns null for missing / malformed values', () => {
    expect(deriveKifagDepartmentPrefix(null)).toBeNull()
    expect(deriveKifagDepartmentPrefix('')).toBeNull()
    expect(deriveKifagDepartmentPrefix('NoDash')).toBeNull()
    expect(deriveKifagDepartmentPrefix('-23')).toBeNull()
  })
})
