text: 'use strict';
  
  const { Collection } = require('@discordjs/collection');
  const APIRequest = require('./APIRequest');
  const routeBuilder = require('./APIRouter');
  const RequestHandler = require('./RequestHandler');
  const { Error } = require('../errors');
  const { Endpoints } = require('../util/Constants');
  
  class RESTManager {
    constructor(client, tokenPrefix = '') {
      this.client = client;
      this.handlers = new Collection();
      this.tokenPrefix = tokenPrefix;
      this.versioned = true;
      this.globalLimit = client.options.restGlobalRateLimit > 0 ? client.options.restGlobalRateLimit : Infinity;
      this.globalRemaining = this.globalLimit;
      this.globalReset = null;
      this.globalDelay = null;
      if (client.options.restSweepInterval > 0) {
        this.sweepInterval = setInterval(() => {
          this.handlers.sweep(handler => handler._inactive);
        }, client.options.restSweepInterval * 1000).unref();
      }
    }
  
    get api() {
      return routeBuilder(this);
    }
  
    getAuth() {
      if (this.client.token && this.client.user && this.client.user.bot) {
        return `Bot ${this.client.token}`;
      } else if (this.client.token) {
        return this.client.token;
      }
      throw new Error('TOKEN_MISSING');
    }
  
    get cdn() {
      return Endpoints.CDN(this.client.options.http.cdn);
    }
  
    request(method, url, options = {}) {
      const apiRequest = new APIRequest(this, method, url, options);
      let handler = this.handlers.get(apiRequest.route);
  
      if (!handler) {
        handler = new RequestHandler(this);
        this.handlers.set(apiRequest.route, handler);
      }
  
      return handler.push(apiRequest);
    }
  
    get endpoint() {
      return this.client.options.http.api;
    }
  
    set endpoint(endpoint) {
      this.client.options.http.api = endpoint;
    }
  }
  
  module.exports = RESTManager;
  