import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { ConfigService } from '@nestjs/config';

/**
 * JWT 전략
 *
 * @description
 * JWT 토큰을 검증하고 사용자 정보를 추출하는 전략입니다.
 * Bearer 토큰에서 JWT를 추출하여 검증합니다.
 *
 * @export
 * @class JwtStrategy
 * @extends {PassportStrategy(Strategy)}
 */
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private configService: ConfigService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false, //false로 설정하면 토큰 만료 시 인증 실패
      secretOrKey: configService.get<string>('JWT_SECRET') || 'your-secret-key',
    });
  }

  /**
   * JWT 페이로드 검증 및 사용자 정보 반환
   *
   * @param {any} payload - JWT 페이로드
   * @returns {any} 검증된 사용자 정보
   */
  validate(payload: any) {
    if (!payload.userId) {
      throw new UnauthorizedException('유효하지 않은 토큰입니다.');
    }

    // Request 객체의 user 속성에 저장됨
    return {
      userId: payload.userId,
      userNo: payload.userNo,
      role: payload.role || 'user',
    };
  }
}
