import { UNAUTHORIZED } from '@api/constants/admin.constant';
import { isDevSwaggerRequest } from '@api/helpers/request.helper';
import {
  CanActivate,
  ExecutionContext,
  Injectable,
  UnauthorizedException,
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { JwtService } from '@nestjs/jwt';
import { Request } from 'express';

@Injectable()
export class AdminJwtAuthGuard implements CanActivate {
  private readonly DEV_ADMIN = {
    admId: 19,
    admLoginId: 'rsteam',
  };
  constructor(
    private jwtService: JwtService,
    private reflector: Reflector,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest<Request>();
    const token = request.cookies['_aaT'];

    // if (isLocalRequest(request)) {
    //   request['admin'] = this.DEV_ADMIN;
    //   return true;
    // }

    if (this.reflector.get<boolean>('isPublic', context.getHandler())) {
      return true;
    }

    try {
      const payload = this.jwtService.verify(token);
      request['admin'] = payload;
      return true;
    } catch (e) {
      if (isDevSwaggerRequest(request)) {
        // 스웨거 편리성을 위하여 개발서버인 경우 강제주입
        request['admin'] = this.DEV_ADMIN;
        return true;
      } else {
        throw new UnauthorizedException(UNAUTHORIZED);
      }
    }
  }
}
