import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth/auth.module';
import { UsersModule } from './users/users.module';
import { APP_GUARD } from '@nestjs/core';
import { CsrfModule } from './csrf/csrf.module';
import { ServeStaticModule } from '@nestjs/serve-static';
import { resolve } from 'path';
import { AdminModule } from './admin/admin.module';
import { AccessTokenGuard } from './auth/guards/accessToken.guard';
import { PrismaModule } from './prisma/prisma.module';
import { EmailModule } from './email/email.module';
import { RolesGuard } from './roles/roles.guard';
import { RolesModule } from './roles/roles.module';
import { PublicModule } from './public/public.module';
import { ReportsModule } from './reports/reports.module';
import { UploadModule } from './upload/upload.module';
import { ConfigModule } from '@nestjs/config';
import { ManagementModule } from './management/management.module';
import { GroupModule } from './group/group.module';
import { MemberModule } from './member/member.module';
import { AuditModule } from './audit/audit.module';

const pathToStaticAssets = process.env.NODE_ENV === 'development' ?
                           resolve(__dirname, '..', '..', 'client', '.output', 'static') :
                           resolve(__dirname, 'static')

const NODE_ENV = process.env.NODE_ENV;

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: `.env.${NODE_ENV}`,
    }),
    ServeStaticModule.forRoot({
      rootPath: pathToStaticAssets,
    }),
    PrismaModule,
    CsrfModule,
    AuthModule,
    UsersModule,
    AdminModule,
    PrismaModule,
    EmailModule,
    RolesModule,
    PublicModule,
    ReportsModule,
    UploadModule,
    ManagementModule,
    GroupModule,
    MemberModule,
    AuditModule
  ],
  controllers: [AppController],
  providers: [
    AppService,
    // https://docs.nestjs.com/recipes/passport#enable-authentication-globally
    {
      provide: APP_GUARD,
      useClass: AccessTokenGuard,
    },
    {
      provide: APP_GUARD,
      useClass: RolesGuard,
    },
    // {
    //   provide: APP_INTERCEPTOR,
    //   useClass: ClearCsrfInterceptor,
    // },
  ],
})

export class AppModule {};
// export class AppModule implements NestModule {
//   configure(consumer: MiddlewareConsumer) {
//     consumer
//       .apply(LoggerMiddleware)
//       .forRoutes(
//         '*'
//         // AuthController,
//         // UsersController
//       );
//   }
// }
