import { describe, expect, it } from 'vitest'
import {
  compensationIdempotencyKey,
  debitIdempotencyKey,
  grantIdempotencyKey,
  operatorAdjustmentIdempotencyKey,
  providerEventIdempotencyKey,
  purchaseIdempotencyKey,
  reversalIdempotencyKey,
  submissionIdempotencyKey,
} from '../src/index.js'

describe('stable namespaced idempotency keys', () => {
  it('builds every money and conversion mutation key deterministically', () => {
    expect(purchaseIdempotencyKey('user-1', 'intent-1')).toBe('pdf2html:purchase:user-1:intent-1')
    expect(providerEventIdempotencyKey('stripe', 'evt_1')).toBe('pdf2html:event:stripe:evt_1')
    expect(grantIdempotencyKey('stripe', 'pi_1')).toBe('pdf2html:grant:stripe:pi_1')
    expect(reversalIdempotencyKey('stripe', 'refund', 're_1')).toBe('pdf2html:reversal:stripe:refund:re_1')
    expect(submissionIdempotencyKey('user-1', 'submit-1')).toBe('pdf2html:submission:user-1:submit-1')
    expect(debitIdempotencyKey('conversion-1')).toBe('pdf2html:debit:conversion-1')
    expect(compensationIdempotencyKey('conversion-1')).toBe('pdf2html:compensation:conversion-1')
    expect(operatorAdjustmentIdempotencyKey('adjustment-1')).toBe('pdf2html:operator-adjustment:adjustment-1')
  })

  it('escapes separators so distinct identities do not collide', () => {
    expect(purchaseIdempotencyKey('a:b', 'c')).not.toBe(purchaseIdempotencyKey('a', 'b:c'))
    expect(purchaseIdempotencyKey('a:b', 'c')).toBe('pdf2html:purchase:a%3Ab:c')
  })

  it('rejects missing provider identities', () => {
    expect(() => providerEventIdempotencyKey('stripe', '')).toThrow(TypeError)
  })
})
