import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import rateLimit from 'express-rate-limit';
import { RATE_LIMIT_KEY } from '../decorators/rate-limit.decorator';

@Injectable()
export class RouteRateLimitGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const rateLimitOptions = this.reflector.get(RATE_LIMIT_KEY, context.getHandler());

    if (!rateLimitOptions) {
      return true;
    }

    const request = context.switchToHttp().getRequest();
    const response = context.switchToHttp().getResponse();

    const routeLimiter = rateLimit({
      ...rateLimitOptions,
      standardHeaders: true,
      legacyHeaders: false,
    });

    return new Promise((resolve, reject) => {
      routeLimiter(request, response, err => {
        if (err) {
          reject(false);
        } else {
          resolve(true);
        }
      });
    });
  }
}
