import { ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';
import { IS_PUBLIC_KEY } from '../../common/decorators/public.decorator';

@Injectable()
export class AccessTokenGuard extends AuthGuard('accessToken') {
  constructor(private reflector: Reflector) {
    super();
  }

  canActivate(context: ExecutionContext) {
    // console.log('Triggered accessToken.guard.ts');
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    // console.log('isPublic', isPublic);
    if (isPublic) return true;
    return super.canActivate(context);
  }

  handleRequest(err: any, user: any, info: any) {
    // console.log('handleRequest, accessToken.guard')
    // console.log(err)
    // console.log(user)
    // console.log(info)
    // You can throw an exception based on either "info" or "err" arguments
    // console.log(1234, err, user)
    if (err || !user) {
      throw err || new UnauthorizedException();
    }
    return user;
  }
}
