import { Global, Module, OnApplicationBootstrap } from '@nestjs/common';
import { pgPoolProvider, kyselyProvider } from './database.provider';
import { Kysely } from 'kysely';
import { Pool } from 'pg';
import { Logger } from 'pino-nestjs';

@Global()
@Module({
  providers: [pgPoolProvider, kyselyProvider],
  exports: [Kysely, Pool],
})
export class DatabaseModule implements OnApplicationBootstrap {
  constructor(
    private readonly pool: Pool,
    private readonly logger: Logger,
  ) {}

  async onApplicationBootstrap() {
    const timeout = new Promise<never>((_, reject) =>
      setTimeout(() => reject(new Error('Database connection timed out after 3s')), 3000),
    );

    try {
      this.logger.log('Checking database connection...');
      const client = await Promise.race([this.pool.connect(), timeout]);
      await client.query('SELECT 1');
      client.release();
      this.logger.log('Database connection established successfully');
    } catch (err) {
      this.logger.error('Failed to connect to the database', err);
      process.exit(1);
    }
  }
}
