import { it, expect } from 'vitest'
import { makeInMemoryRecordStore } from '@platform-modules/record-store'
import { makeCaptureAdapter, type CapturedMail } from './capture.js'
import type { MailMessage } from './index.js'

const sampleMessage: MailMessage = {
  from: 'from@example.com',
  to: ['to@example.com', 'other@example.com'],
  replyTo: 'reply@example.com',
  cc: 'cc@example.com',
  bcc: 'bcc@example.com',
  subject: 'Hello',
  html: '<p>Hi</p>',
  text: 'Hi',
  headers: { 'X-Custom': '1' },
  tags: { campaign: 'test' },
  idempotencyKey: 'idem-1',
}

it('captures the message verbatim and returns the stored id with default provider', async () => {
  const store = makeInMemoryRecordStore<CapturedMail>()
  const adapter = makeCaptureAdapter({ store })

  const result = await adapter.send(sampleMessage)
  const page = await store.list()

  expect(result).toEqual({ id: page.items[0]!.id, provider: 'capture' })
  expect(page.items[0]!.record).toEqual(sampleMessage)
})

it('uses the provider label override', async () => {
  const store = makeInMemoryRecordStore<CapturedMail>()
  const adapter = makeCaptureAdapter({ store, provider: 'preview' })

  const result = await adapter.send(sampleMessage)

  expect(result.provider).toBe('preview')
})

it('appends multiple messages newest-first', async () => {
  const store = makeInMemoryRecordStore<CapturedMail>()
  const adapter = makeCaptureAdapter({ store })

  const first = { ...sampleMessage, subject: 'First' }
  const second = { ...sampleMessage, subject: 'Second' }

  await adapter.send(first)
  await adapter.send(second)

  const page = await store.list()
  expect(page.items).toHaveLength(2)
  expect(page.items[0]!.record).toEqual(second)
  expect(page.items[1]!.record).toEqual(first)
})
