import { describe, expect, it } from 'vitest'
import { UnsupportedOperation, type MarketingAdapter } from './index.js'
import { scheduleCampaign } from './scheduling.js'

function fakeAdapter(supports: MarketingAdapter['supports']): MarketingAdapter {
  return {
    name: 'fake',
    supports,
    async upsertContact() {},
    async removeContact() {},
    async tagContact() {},
    async createList() {
      return { id: '1', name: 'L' }
    },
    async lists() {
      return []
    },
    async createCampaign(input) {
      return { ...input, id: 'c1' }
    },
    async sendCampaign() {
      return { sent: [], refused: [] }
    },
    async campaignStats() {
      return { opens: 0, clicks: 0, bounces: 0, unsubs: 0 }
    },
    async syncSuppression() {
      return []
    },
    async scheduleCampaign() {},
  } as MarketingAdapter & { scheduleCampaign: (id: string, at: string) => Promise<void> }
}

describe('scheduling capability', () => {
  it('succeeds on a supporting adapter', async () => {
    const adapter = fakeAdapter({ segments: false, scheduling: true, automation: false })
    await expect(scheduleCampaign(adapter, 'camp-1', '2026-07-01T09:00:00.000Z')).resolves.toBeUndefined()
  })

  it('throws UnsupportedOperation on a non-supporting adapter', async () => {
    const adapter = fakeAdapter({ segments: true, scheduling: false, automation: false })
    await expect(
      scheduleCampaign(adapter, 'camp-1', '2026-07-01T09:00:00.000Z'),
    ).rejects.toBeInstanceOf(UnsupportedOperation)
  })
})
