import { describe, expect, it } from 'vitest'
import { BASE_2030, calculateScenario, DEFAULT_INPUTS } from './model'

describe('GPU cloud economics model', () => {
  it('matches the spreadsheet baseline at zero incremental TPS uplift', () => {
    const result = calculateScenario({
      ...DEFAULT_INPUTS,
      tpsUplift: 0,
      cloudCapture: 0,
    })

    expect(result.activeMW).toBeCloseTo(1000, 6)
    expect(result.tokensQ).toBeCloseTo(BASE_2030.tokensQ, 6)
    expect(result.cloudRevenueM).toBeCloseTo(BASE_2030.cloudRevenueM, 6)
    expect(result.ebitM).toBeCloseTo(3385.9554858, 5)
  })

  it('matches the 25% TPS fixed-capacity spreadsheet scenario', () => {
    const result = calculateScenario(DEFAULT_INPUTS)

    expect(result.activeMW).toBeCloseTo(1000, 6)
    expect(result.tokensQ).toBeCloseTo(45.1795202468, 6)
    expect(result.cloudRevenueM).toBeCloseTo(13503.8978073, 5)
    expect(result.ebitM).toBeCloseTo(4180.3024156, 5)
    expect(result.grossRoce).toBeCloseTo(0.1381287543, 6)
    expect(result.costPerMillionTokens).toBeCloseTo(0.2063677379, 6)
  })

  it('uses 20% less capacity when 25% more TPS serves fixed demand', () => {
    const result = calculateScenario({
      ...DEFAULT_INPUTS,
      capacityMode: 'demand',
    })

    expect(result.activeMW).toBeCloseTo(800, 6)
    expect(result.tokensQ).toBeCloseTo(BASE_2030.tokensQ, 6)
    expect(result.grossGpuCapexM).toBeCloseTo(BASE_2030.grossGpuCapexM * 0.8, 6)
    expect(result.costPerMillionTokens).toBeCloseTo(0.2063677379, 6)
  })
})
