import { Module, forwardRef } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import {
  ProgramSession,
  ProgramRegistration,
  ProgramRegistrationOnlineSession,
  BackgroundJob,
  User,
  ZoomAnalyticsLiveEvent,
  ZoomAnalyticsSessionSummary,
  ZoomAnalyticsAttendeeSummary,
  ZoomGeneratedRegistrantLink,
} from 'src/common/entities';
import { AuthModule } from 'src/auth/auth.module';
import { UserModule } from 'src/user/user.module';
import { ExcelService } from 'src/common/services/excel.service';
import { AwsS3Service } from 'src/common/services/awsS3.service';
import { OnlineSessionModule } from 'src/online-session/online-session.module';
import { OnlineAttendanceModule } from 'src/online-attendance/online-attendance.module';
import { SessionCommunicationModule } from 'src/session-communication/session-communication.module';
import { ZoomTokenController } from './controllers/zoom-token.controller';
import { ZoomTemplateController } from './controllers/zoom-template.controller';
import { ZoomOAuthService } from './services/zoom-oauth.service';
import { ZoomApiService } from './services/zoom-api.service';
import { ZoomJwtService } from './services/zoom-jwt.service';
import { ZoomRegistrationService } from './services/zoom-registration.service';
import { ZoomBulkRegistrationService } from './services/zoom-bulk-registration.service';
import { ZoomWebinarRepository } from './repositories/zoom-webinar.repository';
import { ZoomRegistrationRepository } from './repositories/zoom-registration.repository';
import { ZoomProvider } from './zoom.provider';
import { WebinarService } from './sessions/webinar.service';
import { MeetingService } from './sessions/meeting.service';
import { ZoomAnalyticsWebhookController } from './controllers/zoom-analytics-webhook.controller';
import { ZoomAnalyticsConfigService } from './services/zoom-analytics-config.service';
import { ZoomAnalyticsProviderRegistry } from './registries/zoom-analytics-provider.registry';
import { ZoomAnalyticsHttpUtil } from './services/zoom-analytics-http.util';
import { ZoomReportApiClient } from './services/zoom-report-api.client';
import { ZoomDashboardApiClient } from './services/zoom-dashboard-api.client';
import { ZoomAnalyticsRosterRepository } from './repositories/zoom-analytics-roster.repository';
import { ZoomAnalyticsLiveEventRepository } from './repositories/zoom-analytics-live-event.repository';
import { ZoomAnalyticsSessionSummaryRepository } from './repositories/zoom-analytics-session-summary.repository';
import { ZoomAnalyticsAttendeeSummaryRepository } from './repositories/zoom-analytics-attendee-summary.repository';
import { ZoomWebinarAnalyticsProvider } from './services/zoom-webinar-analytics.provider';
import { ZoomMeetingAnalyticsProvider } from './services/zoom-meeting-analytics.provider';
import { ZoomAnalyticsWebhookService } from './services/zoom-analytics-webhook.service';
import { ZoomAnalyticsLivePollScheduler } from './schedulers/zoom-analytics-live-poll.scheduler';
import { ZoomAnalyticsFacadeService } from './services/zoom-analytics-facade.service';
import { ZoomGeneratedRegistrantLinkRepository } from './repositories/zoom-generated-registrant-link.repository';
import { ZoomGeneratedLinkService } from './services/zoom-generated-link.service';
import { ZoomGeneralLinkController } from './controllers/zoom-general-link.controller';
import { ZoomFinalSessionConfirmService } from './services/zoom-final-session-confirm.service';
import { ZoomFinalSessionAttendanceService } from './services/zoom-final-session-attendance.service';
import { ZoomFinalSessionConfirmController } from './controllers/zoom-final-session-confirm.controller';
import { ZoomProgramAnalyticsService } from './services/zoom-program-analytics.service';

@Module({
  imports: [
    TypeOrmModule.forFeature([
      ProgramSession,
      ProgramRegistration,
      ProgramRegistrationOnlineSession,
      BackgroundJob,
      User,
      ZoomAnalyticsLiveEvent,
      ZoomAnalyticsSessionSummary,
      ZoomAnalyticsAttendeeSummary,
      ZoomGeneratedRegistrantLink,
    ]),
    forwardRef(() => AuthModule),
    forwardRef(() => UserModule),
    OnlineSessionModule,
    OnlineAttendanceModule,
    forwardRef(() => SessionCommunicationModule),
  ],
  controllers: [
    ZoomTokenController,
    ZoomTemplateController,
    ZoomAnalyticsWebhookController,
    ZoomGeneralLinkController,
    ZoomFinalSessionConfirmController,
  ],
  providers: [
    ZoomOAuthService,
    ZoomApiService,
    ZoomJwtService,
    ZoomRegistrationService,
    ZoomBulkRegistrationService,
    ZoomWebinarRepository,
    ZoomRegistrationRepository,
    WebinarService,
    MeetingService,
    ZoomProvider,
    ExcelService,
    AwsS3Service,
    ZoomAnalyticsConfigService,
    ZoomAnalyticsProviderRegistry,
    ZoomAnalyticsHttpUtil,
    ZoomReportApiClient,
    ZoomDashboardApiClient,
    ZoomAnalyticsRosterRepository,
    ZoomAnalyticsLiveEventRepository,
    ZoomAnalyticsSessionSummaryRepository,
    ZoomAnalyticsAttendeeSummaryRepository,
    ZoomWebinarAnalyticsProvider,
    ZoomMeetingAnalyticsProvider,
    ZoomAnalyticsWebhookService,
    ZoomAnalyticsLivePollScheduler,
    ZoomAnalyticsFacadeService,
    ZoomGeneratedRegistrantLinkRepository,
    ZoomGeneratedLinkService,
    ZoomFinalSessionConfirmService,
    ZoomFinalSessionAttendanceService,
    ZoomProgramAnalyticsService,
  ],
  exports: [
    ZoomRegistrationService,
    ZoomJwtService,
    ZoomApiService,
    ZoomAnalyticsFacadeService,
    ZoomGeneratedLinkService,
  ],
})
export class ZoomModule {}
