import { forwardRef, Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { HttpModule } from '@nestjs/axios';
import { RolesGuard } from '@/middleware/roles.guard';
import { APP_GUARD } from '@nestjs/core';
import { JwtModule } from '@nestjs/jwt';
import { ConfigService } from '@nestjs/config';
import { AppConfig } from '@/config/configs';
import { AuthHelper } from '../../utils/auth.helpers';
import { DeviceModule } from '../devices/device.module';
import { MailModule } from '../mail/mail.module';
import { NotificationsModule } from '../notifications/notifications.module';
import { BillingModule } from '../billing/billing.module';
import { ReferralsModule } from '../referrals/referrals.module';

@Module({
  imports: [
    HttpModule,
    DeviceModule,
    MailModule,
    forwardRef(() => NotificationsModule),
    forwardRef(() => BillingModule),
    forwardRef(() => ReferralsModule),
    JwtModule.registerAsync({
      global: true,
      inject: [ConfigService],
      useFactory: (configService: ConfigService<AppConfig, true>) => ({
        secret: configService.get('auth.jwtSecret', { infer: true }),
        signOptions: {
          expiresIn: configService.get('auth.jwtExpiresIn', { infer: true }),
        },
      }),
    }),
  ],
  controllers: [AuthController],
  providers: [AuthService, AuthHelper, { provide: APP_GUARD, useClass: RolesGuard }],
  exports: [AuthService, AuthHelper],
})
export class AuthModule {}
