
import { Module, forwardRef } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { PrismaModule } from 'src/prisma/prisma.module';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { RolesModule } from 'src/roles/roles.module';
import { RolesService } from 'src/roles/roles.service';
import { UsersModule } from '../users/users.module';
import { UsersService } from 'src/users/users.service';
import { LocalStrategy } from './guards/local.strategy';
import { EmailService } from 'src/email/email.service';
import { AccessTokenStrategy } from './guards/accessToken.strategy';
import { RefreshTokenStrategy } from './guards/refreshToken.strategy';

@Module({
  imports: [
    PrismaModule,
    PassportModule,
    JwtModule.register({}),
    forwardRef(() => UsersModule),
    RolesModule,
  ],
  providers: [
    AuthService,
    // TODO: This is now required after adding emailService to user.service and module? why?
    EmailService,
    // Used in accessToken.strategy, it is imported via module ref
    // Which is used within the refresh method of auth.controller/service
    // It seems to be required because this module provides the AccessTokenStrategy
    UsersService,
    // Used in refreshToken.strategy, it is imported via module ref
    // Which is utilised within the refresh method of auth.controller/service
    // It seems to be required because this module provides the RefreshTokenStrategy
    RolesService,
    // https://docs.nestjs.com/recipes/passport#implementing-passport-local
    LocalStrategy,
    // https://docs.nestjs.com/recipes/passport#implementing-passport-jwt
    AccessTokenStrategy,
    // https://www.elvisduru.com/blog/nestjs-jwt-authentication-refresh-token#implement-passport-jwt
    RefreshTokenStrategy,
  ],
  controllers: [AuthController],
  exports: [AuthService],
})

export class AuthModule {}
