import { ServerClient } from 'postmark'
import {
  MailProviderError,
  type MailAdapter,
  type MailMessage,
  type MailResult,
} from './index.js'

export type PostmarkAdapterConfig = {
  serverToken: string
}

function toList(value: string | string[]): string {
  const list = Array.isArray(value) ? value : [value]
  return list.join(',')
}

export function makePostmarkAdapter({
  serverToken,
}: PostmarkAdapterConfig): MailAdapter {
  const client = new ServerClient(serverToken)

  return {
    async send(msg: MailMessage): Promise<MailResult> {
      try {
        // msg.idempotencyKey is intentionally NOT forwarded — Postmark has no
        // API-level idempotency (verified 2026-06-14). The dropped field is
        // deliberate, never silent; cross-provider exactly-once is a jobs'
        // IdempotencyStore concern at dispatch, not the provider call.
        const response = await client.sendEmail({
          From: msg.from,
          To: toList(msg.to),
          Cc: msg.cc ? toList(msg.cc) : undefined,
          Bcc: msg.bcc ? toList(msg.bcc) : undefined,
          Subject: msg.subject,
          HtmlBody: msg.html,
          TextBody: msg.text,
          ReplyTo: msg.replyTo,
          Headers: msg.headers
            ? Object.entries(msg.headers).map(([Name, Value]) => ({ Name, Value }))
            : undefined,
        })

        return { id: response.MessageID, provider: 'postmark' }
      } catch (err) {
        const statusCode =
          typeof err === 'object' &&
          err !== null &&
          'statusCode' in err &&
          typeof err.statusCode === 'number'
            ? err.statusCode
            : undefined

        throw new MailProviderError(
          err instanceof Error ? err.message : 'postmark send failed',
          'postmark',
          statusCode !== undefined && statusCode >= 500,
          err,
        )
      }
    },
  }
}
