import { Resend, type CreateEmailOptions } from 'resend'
import {
  MailProviderError,
  type MailAdapter,
  type MailMessage,
  type MailResult,
} from './index.js'

export type ResendAdapterConfig = {
  apiKey: string
}

function toList(value: string | string[]): string[] {
  return Array.isArray(value) ? value : [value]
}

function toResendPayload(msg: MailMessage): CreateEmailOptions {
  const base = {
    from: msg.from,
    to: toList(msg.to),
    cc: msg.cc ? toList(msg.cc) : undefined,
    bcc: msg.bcc ? toList(msg.bcc) : undefined,
    subject: msg.subject,
    headers: msg.headers,
    replyTo: msg.replyTo,
    tags: msg.tags
      ? Object.entries(msg.tags).map(([name, value]) => ({ name, value }))
      : undefined,
  }

  if (msg.html) {
    return { ...base, html: msg.html, text: msg.text }
  }
  return { ...base, text: msg.text! }
}

export function makeResendAdapter({ apiKey }: ResendAdapterConfig): MailAdapter {
  const resend = new Resend(apiKey)

  return {
    async send(msg: MailMessage): Promise<MailResult> {
      try {
        // idempotencyKey is a send-option (→ Idempotency-Key header), not a
        // CreateEmailOptions body field — forward it as the 2nd arg (resend@6.12.4
        // emails.send(payload, options?), verified 2026-06-14).
        const { data, error } = await resend.emails.send(
          toResendPayload(msg),
          msg.idempotencyKey ? { idempotencyKey: msg.idempotencyKey } : undefined,
        )

        if (error) {
          throw new MailProviderError(
            error.message,
            'resend',
            error.statusCode != null && error.statusCode >= 500,
            error,
          )
        }

        if (!data?.id) {
          throw new MailProviderError('resend returned no message id', 'resend', false)
        }

        return { id: data.id, provider: 'resend' }
      } catch (err) {
        if (err instanceof MailProviderError) throw err
        throw new MailProviderError(
          err instanceof Error ? err.message : 'resend send failed',
          'resend',
          false,
          err,
        )
      }
    },
  }
}
