import { PGlite } from '@electric-sql/pglite'
import { drizzle } from 'drizzle-orm/pglite'
import type { PgliteDatabase } from 'drizzle-orm/pglite'
import type { Schema, TransactionalDatabase } from '../index.js'
import { withTransactionIdentity } from '../transaction.js'

type PgliteTransactionalDatabase<S extends Schema> = Omit<PgliteDatabase<S>, 'transaction'> & {
  transaction: TransactionalDatabase<S>['transaction']
  /** drizzle attaches the driver instance; declared so callers can close the database in teardown. */
  $client: PGlite
}

export function createPgliteClient<S extends Schema>(opts: {
  schema?: S
  dataDir?: string
} = {}): PgliteTransactionalDatabase<S> {
  const client = opts.dataDir !== undefined ? new PGlite(opts.dataDir) : new PGlite()
  return withTransactionIdentity(drizzle(client, { schema: opts.schema })) as unknown as PgliteTransactionalDatabase<S>
}
