import { Injectable, OnModuleDestroy } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { drizzle, type NodePgDatabase } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
import * as schema from '../../database/schema';

export type Database = NodePgDatabase<typeof schema>;

@Injectable()
export class DatabaseService implements OnModuleDestroy {
  readonly pool: Pool;
  readonly db: Database;

  constructor(config: ConfigService) {
    const useSsl = config.get<boolean>('DATABASE_SSL', false);
    const rejectUnauthorized = config.get<boolean>('DATABASE_SSL_REJECT_UNAUTHORIZED', true);

    this.pool = new Pool({
      connectionString: config.getOrThrow<string>('DATABASE_URL'),
      max: config.get<number>('DATABASE_POOL_MAX', 10),
      ssl: useSsl ? { rejectUnauthorized } : false,
      application_name: 'ck-terminal-api',
      idleTimeoutMillis: 30_000,
      connectionTimeoutMillis: 10_000,
    });

    this.db = drizzle(this.pool, { schema });
  }

  async onModuleDestroy(): Promise<void> {
    await this.pool.end();
  }
}
