import { describe, expect, it } from 'vitest'
import {
  canTransitionConversion,
  canTransitionPayment,
  createAppliedReversal,
  isConversionStatus,
  isPaymentState,
} from '../src/index.js'

describe('closed lifecycle states', () => {
  it('allows only forward conversion transitions and closes terminal states', () => {
    expect(canTransitionConversion('Queued', 'Processing')).toBe(true)
    expect(canTransitionConversion('Queued', 'Failed')).toBe(true)
    expect(canTransitionConversion('Processing', 'Complete')).toBe(true)
    expect(canTransitionConversion('Complete', 'Failed')).toBe(false)
    expect(canTransitionConversion('Failed', 'Processing')).toBe(false)
    expect(isConversionStatus('Expired')).toBe(false)
  })

  it('models payment success, failure, reconciliation, and reversal states', () => {
    expect(canTransitionPayment('pending', 'paid')).toBe(true)
    expect(canTransitionPayment('pending', 'failed')).toBe(true)
    expect(canTransitionPayment('paid', 'refunded')).toBe(true)
    expect(canTransitionPayment('paid', 'disputed')).toBe(true)
    expect(canTransitionPayment('paid', 'chargeback')).toBe(true)
    expect(canTransitionPayment('refunded', 'paid')).toBe(false)
    expect(isPaymentState('reconciliation')).toBe(true)
    expect(isPaymentState('secret_internal_state')).toBe(false)
  })

  it('requires a positive append-only reversal linked to its original grant', () => {
    expect(createAppliedReversal({ originalGrantId: 'grant-1', reversalEntryId: 'reverse-1', amount: 2n }))
      .toEqual({ originalGrantId: 'grant-1', reversalEntryId: 'reverse-1', amount: 2n, state: 'applied' })
    expect(() => createAppliedReversal({ originalGrantId: '', reversalEntryId: 'r', amount: 1n })).toThrow()
    expect(() => createAppliedReversal({ originalGrantId: 'g', reversalEntryId: 'r', amount: 0n })).toThrow()
  })
})
