import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { JwtModule } from '@nestjs/jwt';
import { ConfigModule, ConfigService } from '@nestjs/config';

import { Meeting } from './entities/meeting.entity';
import { MeetingParticipant } from './entities/meeting-participant.entity';
import { MeetingInvite } from './entities/meeting-invite.entity';

import { AuditScheduleRow } from '../audit-schedules/entities/audit-schedule-row.entity';
import { Company } from '../companies/entities/company.entity';
import { User } from '../user/entities/user.entity';

import { MeetingGateway } from './meeting.gateway';
import { RoomRegistry } from './room.registry';
import { MeetingService } from './services/meeting.service';
import { MeetingInviteService } from './services/meeting-invite.service';
import { RoomCodeGeneratorService } from './services/room-code-generator.service';
import { MeetingController } from './meeting.controller';
import { JoinController } from './join.controller';

// invites are emailed from the inviter's own mailbox, same as the rest of
// the app — replies go to a real person
import { MailsModule } from '../mails/mails.module';

@Module({
  imports: [
    TypeOrmModule.forFeature(
      [
        Meeting,
        MeetingParticipant,
        MeetingInvite,
        AuditScheduleRow,
        Company,
        User,
      ],
      'scheme_dbs',
    ),
    // registerAsync, not register — plain register() reads process.env before
    // ConfigModule has loaded it and silently falls back to the default
    JwtModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        secret: config.get<string>('JWT_SECRET'),
      }),
    }),
    MailsModule,
  ],
  controllers: [MeetingController, JoinController],
  providers: [
    MeetingGateway,
    RoomRegistry,
    MeetingService,
    MeetingInviteService,
    RoomCodeGeneratorService,
  ],
  exports: [MeetingService, MeetingInviteService, RoomRegistry],
})
export class MeetingModule {}
