/**
 * Team Capacity Calculator Unit Tests
 *
 * Tests utilization calculation and status thresholds
 * used by the capacity API route.
 */

import { describe, it, expect } from 'vitest'
import { calculateCapacity, type CapacityInput } from '@/lib/youtube/capacity-calculator'

describe('Capacity Calculator', () => {
  it('should calculate utilization percentage', () => {
    const input: CapacityInput = {
      userId: 1,
      userName: 'Max',
      activeTasks: 5,
      estimatedHours: 20,
      videosInPipeline: 3,
      availableHoursPerWeek: 40,
    }

    const result = calculateCapacity(input)

    expect(result.utilization).toBe(50)
    expect(result.status).toBe('green')
  })

  it('should flag overloaded team members as red', () => {
    const input: CapacityInput = {
      userId: 2,
      userName: 'Anna',
      activeTasks: 10,
      estimatedHours: 38,
      videosInPipeline: 8,
      availableHoursPerWeek: 40,
    }

    const result = calculateCapacity(input)

    expect(result.utilization).toBe(95)
    expect(result.status).toBe('red')
  })

  it('should flag busy team members as yellow', () => {
    const input: CapacityInput = {
      userId: 3,
      userName: 'Lisa',
      activeTasks: 8,
      estimatedHours: 32,
      videosInPipeline: 5,
      availableHoursPerWeek: 40,
    }

    const result = calculateCapacity(input)

    expect(result.utilization).toBe(80)
    expect(result.status).toBe('yellow')
  })

  it('should handle zero available hours', () => {
    const input: CapacityInput = {
      userId: 4,
      userName: 'Tom',
      activeTasks: 3,
      estimatedHours: 10,
      videosInPipeline: 2,
      availableHoursPerWeek: 0,
    }

    const result = calculateCapacity(input)

    expect(result.utilization).toBe(0)
    expect(result.status).toBe('green')
  })

  it('should preserve all input fields in the result', () => {
    const input: CapacityInput = {
      userId: 5,
      userName: 'Sara',
      activeTasks: 4,
      estimatedHours: 16,
      videosInPipeline: 2,
      availableHoursPerWeek: 40,
    }

    const result = calculateCapacity(input)

    expect(result.userId).toBe(5)
    expect(result.userName).toBe('Sara')
    expect(result.activeTasks).toBe(4)
    expect(result.estimatedHours).toBe(16)
    expect(result.videosInPipeline).toBe(2)
    expect(result.availableHoursPerWeek).toBe(40)
  })

  it('should return red for utilization over 100%', () => {
    const input: CapacityInput = {
      userId: 6,
      userName: 'Overloaded',
      activeTasks: 30,
      estimatedHours: 60,
      videosInPipeline: 10,
      availableHoursPerWeek: 40,
    }

    const result = calculateCapacity(input)

    expect(result.utilization).toBe(150)
    expect(result.status).toBe('red')
  })

  it('should return green at exactly 70% utilization', () => {
    const input: CapacityInput = {
      userId: 7,
      userName: 'Boundary70',
      activeTasks: 7,
      estimatedHours: 28,
      videosInPipeline: 3,
      availableHoursPerWeek: 40,
    }

    const result = calculateCapacity(input)

    expect(result.utilization).toBe(70)
    expect(result.status).toBe('green')
  })

  it('should return yellow at exactly 90% utilization', () => {
    const input: CapacityInput = {
      userId: 8,
      userName: 'Boundary90',
      activeTasks: 9,
      estimatedHours: 36,
      videosInPipeline: 4,
      availableHoursPerWeek: 40,
    }

    const result = calculateCapacity(input)

    expect(result.utilization).toBe(90)
    expect(result.status).toBe('yellow')
  })
})
