import { readFileSync } from 'node:fs'
import { createRequire } from 'node:module'
import { describe, expect, it } from 'vitest'

const require = createRequire(import.meta.url)

describe('zapier-make integration contract', () => {
  it('uses canonical invoice webhook events in Zapier triggers', () => {
    const newInvoice = require('../../zapier/triggers/new-invoice')
    const invoiceSent = require('../../zapier/triggers/invoice-sent')

    expect(newInvoice.operation.performSubscribe).toBeTypeOf('function')
    expect(invoiceSent.operation.performSubscribe).toBeTypeOf('function')

    const newInvoiceSource = readFileSync(new URL('../../zapier/triggers/new-invoice.js', import.meta.url), 'utf8')
    const invoiceSentSource = readFileSync(new URL('../../zapier/triggers/invoice-sent.js', import.meta.url), 'utf8')

    expect(newInvoiceSource).toContain("event: 'invoice.created'")
    expect(invoiceSentSource).toContain("event: 'invoice.sent'")
  })

  it('uses canonical invoice webhook events in Make trigger module config', () => {
    const config = JSON.parse(
      readFileSync(new URL('../../make/modules/triggers/watch-invoices.json', import.meta.url), 'utf8'),
    ) as {
      parameters?: Array<{ options?: Array<{ value: string }> }>
    }

    const values = config.parameters?.[0]?.options?.map((option) => option.value) ?? []
    expect(values).toEqual(['invoice.created', 'invoice.sent', 'invoice.paid'])
  })
})
