import { VehicleModule } from './modules/vehicle/vehicle.module';
import { DriverModule } from './modules/driver/driver.module';
import { ExternalApiModule } from './modules/external-api/external-api.module';
import {
  MiddlewareConsumer,
  Module,
  NestModule,
  ValidationPipe,
} from "@nestjs/common";
import { ThrottlerModule, ThrottlerGuard } from "@nestjs/throttler";
import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR, APP_PIPE } from "@nestjs/core";

import { AppController } from "./app.controller";

import { AppService } from "./app.service";
import { WinstonLoggerService } from "./common/winston-logger/winston-logger.service";
import { LoggerMiddleware } from "./common/middlewares/logger.middleware";

import { TransformInterceptor } from "./common/interceptors/transform.interceptor";

import { JwtAuthGuard } from "./auth/guards/jwt-auth.guard";
import { AllExceptionsFilter } from "./common/filters/all-exceptions.filter";

import helmet from "helmet";

import { AuthModule } from "./auth/auth.module";
import { ReaderModule } from './modules/reader/reader.module'
import { UsersModule } from "./users/users.module";
import { ConfigModule } from "./config/config.module";
import { PrismaModule } from "./prisma/prisma.module";
import { BlacklistModule } from "./blacklist/blacklist.module";
import { ServeStaticModule } from "@nestjs/serve-static";
import { join } from "path";
import { CylindersModule } from "./modules/cylinders/cylinders.module";
import { CylinderlogsModule } from './modules/cylinderlogs/cylinderlogs.module';
import { MaintenanceHistoryModule } from './modules/maintenance-history/maintenance-history.module';
import { DashboardModule } from './modules/dashboard/dashboard.module';


import { ClientsModule } from "./modules/clients/clients.module";
import { WarehouseModule } from "./modules/warehouse/warehouse.module";
import { CylinderClientModule } from "./modules/cylinder-client/cylinder-client.module";
import { MastersModule } from "./modules/masters/masters.module";

@Module({
  imports: [
    ConfigModule,
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, "..", "..", "uploads"),
      serveRoot: "/uploads",
    }),
    ThrottlerModule.forRoot([
      {
        ttl: 60000, //60 seconds
        limit: 320,
      },
    ]),
    AuthModule,
    CylindersModule,
    CylinderlogsModule,
    MaintenanceHistoryModule,
    DashboardModule,
    ClientsModule,
    WarehouseModule,
    UsersModule,
    PrismaModule,
    BlacklistModule,
    CylinderClientModule,
    ReaderModule,
    ExternalApiModule,
    DriverModule,
    VehicleModule,
    MastersModule,
  ],
  controllers: [AppController],
  providers: [
    AppService,
    WinstonLoggerService,    
    {
      provide: APP_GUARD,
      useClass: ThrottlerGuard,
    },

    {
      provide: APP_GUARD,
      useClass: JwtAuthGuard, // ✅ Global guard
    },
    {
      provide: APP_INTERCEPTOR,
      useClass: TransformInterceptor,
    },
    {
      provide: APP_FILTER,
      useClass: AllExceptionsFilter,
    },
    {
      provide: APP_PIPE,
      useValue: new ValidationPipe({
        whitelist: true,
        forbidNonWhitelisted: true,
        transform: true,
      }),
    },
  ],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes("*");
    // consumer.apply(helmet()).forRoutes("*"); // Apply to all routes
    consumer
      .apply(
        helmet({
          crossOriginResourcePolicy: { policy: "cross-origin" },
          contentSecurityPolicy: {
            directives: {
              defaultSrc: ["'self'"],
              imgSrc: ["'self'", "data:", "https:", "http:"],
              styleSrc: ["'self'", "https:", "'unsafe-inline'"],
              scriptSrc: ["'self'"],
              fontSrc: ["'self'", "https:", "data:"],
              objectSrc: ["'none'"],
              upgradeInsecureRequests: [],
            },
          },
        })
      )
      .forRoutes("*");
  }
}