import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        type: 'postgres',
        host: config.get<string>('database.host'),
        port: config.get<number>('database.port'),
        username: config.get<string>('database.username'),
        password: config.get<string>('database.password'),
        database: config.get<string>('database.name'),
        autoLoadEntities: true,
        synchronize: config.get<string>('app.env') === 'development',
        migrationsRun: true,
        migrations: [__dirname + '/migrations/*{.ts,.js}'],
        // Must match src/database/data-source.ts. Default 'all' wraps
        // every migration in a single transaction and blocks any
        // migration from opting out — `1777300000000-AddBelowFloorPriceCRKind`
        // and `1783800000000-BookingApprovalTriggers` set
        // transaction = false because they run ALTER TYPE ADD VALUE /
        // CREATE TRIGGER which Postgres can't do inside a transaction.
        // `each` runs each migration in its own transaction and lets
        // a single migration opt out via the class field.
        migrationsTransactionMode: 'each',
        logging: config.get<string>('app.env') === 'development',
      }),
    }),
  ],
})
export class DatabaseModule {}
