import { Pool } from '@neondatabase/serverless'
import { drizzle } from 'drizzle-orm/neon-serverless'
import type { NeonDatabase } from 'drizzle-orm/neon-serverless'
import type { Schema, TransactionalDatabase } from '../index.js'
import { withTransactionIdentity } from '../transaction.js'

type NeonServerlessTransactionalDatabase<S extends Schema> = Omit<NeonDatabase<S>, 'transaction'> & {
  transaction: TransactionalDatabase<S>['transaction']
}

export function createNeonServerlessClient<S extends Schema>(opts: {
  connectionString: string
  schema?: S
}): NeonServerlessTransactionalDatabase<S> {
  const pool = new Pool({ connectionString: opts.connectionString })
  return withTransactionIdentity(drizzle(pool, { schema: opts.schema })) as unknown as NeonServerlessTransactionalDatabase<S>
}
