import { Logger, Module, type Provider } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';
import { UserModule } from '../user/user.module';
import { MailModule } from '../mail/mail.module';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { RefreshSession } from './entities/refresh-session.entity';
import { JwtStrategy } from './strategies/jwt.strategy';
import { GoogleStrategy } from './strategies/google.strategy';
import { KakaoStrategy } from './strategies/kakao.strategy';

// 구글 OAuth 전략 — 키가 설정된 경우에만 등록(미설정 시 null → /auth/google 비활성).
const googleStrategyProvider: Provider = {
  provide: GoogleStrategy,
  useFactory: (config: ConfigService, authService: AuthService) => {
    if (!config.get<string>('GOOGLE_CLIENT_ID')) {
      new Logger('AuthModule').warn(
        'GOOGLE_CLIENT_ID 미설정 — 구글 로그인 비활성화',
      );
      return null;
    }
    return new GoogleStrategy(config, authService);
  },
  inject: [ConfigService, AuthService],
};

// 카카오 OAuth 전략 — 키가 설정된 경우에만 등록.
const kakaoStrategyProvider: Provider = {
  provide: KakaoStrategy,
  useFactory: (config: ConfigService, authService: AuthService) => {
    if (!config.get<string>('KAKAO_CLIENT_ID')) {
      new Logger('AuthModule').warn(
        'KAKAO_CLIENT_ID 미설정 — 카카오 로그인 비활성화',
      );
      return null;
    }
    return new KakaoStrategy(config, authService);
  },
  inject: [ConfigService, AuthService],
};

// 인증 모듈 — JWT(access/refresh) + Passport 전략(JWT/구글/카카오) + 메일(인증)
@Module({
  imports: [
    UserModule,
    MailModule,
    PassportModule,
    TypeOrmModule.forFeature([RefreshSession]),
    // 토큰 서명 옵션은 AuthService 에서 호출 단위로 지정하므로 기본 등록만 한다
    JwtModule.register({}),
  ],
  controllers: [AuthController],
  providers: [
    AuthService,
    JwtStrategy,
    googleStrategyProvider,
    kakaoStrategyProvider,
  ],
  exports: [AuthService],
})
export class AuthModule {}
