/**
 * Payment adapter registry — zync-subscription spec (Task 5).
 *
 * Resolves the active ZyncPaymentAdapter from env.ZYNC_PAYMENT_ADAPTER (default: 'null').
 * Application code calls `getPaymentAdapter(env, db)` rather than importing a
 * concrete provider directly — provider implementations are plugged in as packages.
 *
 * Current registry:
 *   'null' → NullPaymentAdapter (default; no real provider; DB-direct operations)
 *
 * To add a provider: create `packages/payments-<name>/src/adapter.ts`,
 * register it here under its string key, add to Env.ZYNC_PAYMENT_ADAPTER docs.
 */
import type { ZyncPaymentAdapter } from './types'
import { NullPaymentAdapter } from './null-adapter'
import type { Db } from '@zync/db/queries'

/** The env subset needed by the registry (avoids importing the full Env interface). */
export interface PaymentEnv {
  ZYNC_PAYMENT_ADAPTER?: string
}

type AdapterFactory = (db: Db) => ZyncPaymentAdapter

const REGISTRY: Record<string, AdapterFactory> = {
  null: (db) => new NullPaymentAdapter(db),
}

/**
 * Resolve the active payment adapter.
 * Reads `env.ZYNC_PAYMENT_ADAPTER` (default `'null'`).
 * Throws if the configured id is not in the registry.
 */
export function getPaymentAdapter(env: PaymentEnv, db: Db): ZyncPaymentAdapter {
  const id = env.ZYNC_PAYMENT_ADAPTER?.trim() || 'null'
  const factory = REGISTRY[id]
  if (!factory) {
    throw new Error(
      `Unknown payment adapter '${id}'. Registered adapters: ${Object.keys(REGISTRY).join(', ')}`,
    )
  }
  return factory(db)
}
