import { Module } from '@nestjs/common';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
import { ConfigModule } from '@nestjs/config';

import { AppController } from './app.controller';
import { AppService } from './app.service';
import { RootController } from './root.controller';

import { PrismaModule } from './prisma/prisma.module';
import { CaslModule } from '@/casl/casl.module';
import { AuthModule } from '@/modules/auth/auth.module';
import { UsersModule } from '@/modules/admin/users/users.module';
import { StakeholdersModule } from '@/modules/admin/stakeholders/stakeholders.module';
import { RolesModule } from '@/modules/admin/roles/roles.module';
import { PermissionsModule } from '@/modules/admin/permissions/permissions.module';
import { WorkingGroupIssuesModule } from '@/modules/working-group-issues/working-group-issues.module';
import { MeetingRequestsModule } from '@/modules/meeting-requests/meeting-requests.module';
import { SystemNotificationsModule } from '@/modules/system-notifications/system-notifications.module';
import { MeetingsModule } from './modules/meetings/meetings.module';
import { MeetingSummaryModule } from './modules/meeting-summary/meeting-summary.module';
import { MeetingSummaryStatusModule } from './modules/meeting-summary-status/meeting-summary-status.module';
import { PlenaryModule } from './modules/plenary/plenary.module';
import { RgcDecisionModule } from './modules/rgc-decision/rgc-decision.module';
import { CdcIssueMatrixModule } from './modules/cdc-issue-matrix/cdc-issue-matrix.module';
import { CefpIssueMatrixModule } from './modules/cefp-issue-matrix/cefp-issue-matrix.module';
import { DashboardModule } from './modules/dashboard/dashboard.module';
import { IndicatorsModule } from './modules/indicators/indicators.module';
import { ProgressReportsModule } from './modules/progress-reports/progress-reports.module';
import { CommentTypeModule } from './modules/comment_type/comment-type.module';
import { getUploadRoot } from './modules/upload/upload-root';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    ServeStaticModule.forRoot({
      rootPath: join(process.cwd(), getUploadRoot()),
      serveRoot: '/uploads',
    }),

    PrismaModule,
    CaslModule,
    AuthModule,

    UsersModule,
    StakeholdersModule,
    PermissionsModule,
    RolesModule,

    WorkingGroupIssuesModule,
    MeetingRequestsModule,
    SystemNotificationsModule,
    MeetingsModule,
    MeetingSummaryModule,
    MeetingSummaryStatusModule,
    PlenaryModule,
    RgcDecisionModule,
    CdcIssueMatrixModule,
    CefpIssueMatrixModule,
    DashboardModule,
    IndicatorsModule,
    ProgressReportsModule,
    CommentTypeModule,
  ],
  controllers: [RootController, AppController],
  providers: [AppService],
})
export class AppModule {}
