import { describe, expect, it } from 'vitest'
import {
  CREDIT_UNIT_PRICE_CENTS,
  canAcceptConversion,
  creditPurchaseTotalCents,
  isValidCreditQuantity,
  parseCreditQuantity,
  projectCreditBalance,
} from '../src/index.js'

describe('integer credit and USD contracts', () => {
  it('prices exact positive quantities in integer cents', () => {
    expect(CREDIT_UNIT_PRICE_CENTS).toBe(500n)
    expect(creditPurchaseTotalCents(1)).toBe(500n)
    expect(creditPurchaseTotalCents(37n)).toBe(18_500n)
    expect(creditPurchaseTotalCents(9_007_199_254_740_993n)).toBe(4_503_599_627_370_496_500n)
  })

  it.each([0, -1, 1.5, Number.NaN, Number.POSITIVE_INFINITY, Number.MAX_SAFE_INTEGER + 1, 0n, -1n])(
    'rejects invalid quantity %s',
    (quantity) => {
      expect(isValidCreditQuantity(quantity)).toBe(false)
      expect(() => parseCreditQuantity(quantity)).toThrow(RangeError)
    },
  )

  it('projects net credits without mutating ledger history', () => {
    expect(projectCreditBalance(3n)).toEqual({ spendable: 3n, deficit: 0n })
    expect(projectCreditBalance(0n)).toEqual({ spendable: 0n, deficit: 0n })
    expect(projectCreditBalance(-3n)).toEqual({ spendable: 0n, deficit: 3n })
    expect(canAcceptConversion(1n)).toBe(true)
    expect(canAcceptConversion(0n)).toBe(false)
    expect(canAcceptConversion(-1n)).toBe(false)
  })
})
