import { sql } from 'drizzle-orm'
import type { Querier } from '@platform-modules/db'
import type { CheckoutSchema } from './schema.js'

export class CheckoutMigrateError extends Error {
  override readonly name = 'CheckoutMigrateError'
  readonly code = 'CHECKOUT_MIGRATE' as const

  constructor(readonly detail: string) {
    super(`checkout migrate: ${detail}`)
  }
}

export function isCheckoutMigrateError(e: unknown): e is CheckoutMigrateError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'CheckoutMigrateError' &&
    (e as { code?: unknown }).code === 'CHECKOUT_MIGRATE'
  )
}

const MIGRATION_STATEMENTS = [
  sql`
    CREATE TABLE IF NOT EXISTS checkout_session (
      order_id uuid PRIMARY KEY,
      client_secret text NOT NULL,
      created_at timestamptz NOT NULL DEFAULT NOW(),
      updated_at timestamptz NOT NULL DEFAULT NOW()
    )
  `,
]

export async function pushSchema(db: Querier<CheckoutSchema>): Promise<void> {
  try {
    for (const statement of MIGRATION_STATEMENTS) {
      await db.execute(statement)
    }
  } catch (e) {
    throw new CheckoutMigrateError(e instanceof Error ? e.message : String(e))
  }
}
