/**
 * db.ts — request-scoped DB service factories.
 *
 * One DB client per invocation (HTTP request, cron tick, queue batch, DO alarm).
 * Identity is stable within a single invocation when memoized via lazy().
 *
 * HTTP workers use createDbService (Neon serverless / WebSocket pool).
 * Cron/queue/DO scheduled contexts use createScheduledDbService (Neon HTTP).
 * DO transactions use createTransactionalDbService (Neon serverless).
 */

import type { DrizzleDb, DrizzleClient, TxDrizzleClient } from '@/server/db/client.js';
import { createNeonRequestDbScope, getDb } from '@/server/db/client.js';
import type { DoDbClient, DoTxDbClient } from '@/server/do-host/lib/db.js';
import { getDb as getScheduledDb, getTransactionalDb, warmDb } from '@/server/do-host/lib/db.js';

export type DbServiceEnv = { DATABASE_URL: string };

export type { DrizzleDb, DrizzleClient, TxDrizzleClient, DoDbClient, DoTxDbClient };

/** HTTP request-scoped DB (Neon serverless). Construct once per invocation. */
export function createDbService(env: DbServiceEnv): DrizzleDb {
  return getDb(env);
}

/** Database lifecycle owned by one HTTP request. */
export function createDbServiceScope(env: DbServiceEnv): {
  db: DrizzleDb;
  close: () => Promise<void>;
} {
  return createNeonRequestDbScope(env);
}

/** Cron/queue/DO scheduled-context DB (Neon HTTP). Construct once per invocation. */
export function createScheduledDbService(env: DbServiceEnv): DoDbClient {
  return getScheduledDb(env);
}

/** DO transactional DB (Neon serverless). Construct once per invocation. */
export function createTransactionalDbService(env: DbServiceEnv): DoTxDbClient {
  return getTransactionalDb(env);
}

/** Warm a scheduled-context DB client (cron entry wrappers). */
export { warmDb };
