import { Module, RequestMethod } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { APP_GUARD } from '@nestjs/core';
import { LoggerModule } from 'nestjs-pino';
import { SessionAuthGuard } from './common/auth/session-auth.guard';
import { DatabaseModule } from './common/database/database.module';
import { OriginGuard } from './common/http/origin.guard';
import { environmentValidationSchema } from './config/env.validation';
import { AuthModule } from './modules/auth/auth.module';
import { HealthModule } from './modules/health/health.module';
import { PortfolioModule } from './modules/portfolio/portfolio.module';
import { TradingModule } from './modules/trading/trading.module';
import { WatchlistsModule } from './modules/watchlists/watchlists.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      validationSchema: environmentValidationSchema,
      validationOptions: {
        abortEarly: false,
      },
    }),
    LoggerModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService) => {
        const isDevelopment = config.get<string>('NODE_ENV') === 'development';
        return {
          forRoutes: [{ path: '*splat', method: RequestMethod.ALL }],
          pinoHttp: {
            level: config.get<string>('LOG_LEVEL', 'info'),
            redact: {
              paths: [
                'req.headers.authorization',
                'req.headers.cookie',
                'res.headers["set-cookie"]',
              ],
              censor: '[REDACTED]',
            },
            transport: isDevelopment
              ? {
                  target: 'pino-pretty',
                  options: {
                    colorize: true,
                    singleLine: true,
                    translateTime: 'SYS:standard',
                  },
                }
              : undefined,
          },
        };
      },
    }),
    DatabaseModule,
    AuthModule,
    HealthModule,
    TradingModule,
    PortfolioModule,
    WatchlistsModule,
  ],
  providers: [
    {
      provide: APP_GUARD,
      useClass: OriginGuard,
    },
    {
      provide: APP_GUARD,
      useClass: SessionAuthGuard,
    },
  ],
})
export class AppModule {}
