/**
 * Очередь запросов для предотвращения rate limiting
 * Автоматически добавляет задержку между запросами
 */
class RequestQueue {
  constructor(delayMs = 200) {
    this.queue = [];
    this.processing = false;
    this.delayMs = delayMs;
  }

  /**
   * Добавить запрос в очередь
   * @param {Function} requestFn - Функция, возвращающая Promise
   * @returns {Promise} - Результат выполнения запроса
   */
  async add(requestFn) {
    return new Promise((resolve, reject) => {
      this.queue.push({ requestFn, resolve, reject });
      if (!this.processing) {
        this.process();
      }
    });
  }

  /**
   * Обработать очередь запросов
   */
  async process() {
    if (this.processing || this.queue.length === 0) {
      return;
    }

    this.processing = true;

    while (this.queue.length > 0) {
      const { requestFn, resolve, reject } = this.queue.shift();

      try {
        const result = await requestFn();
        resolve(result);
      } catch (error) {
        reject(error);
      }

      // Задержка перед следующим запросом
      if (this.queue.length > 0) {
        await new Promise(resolve => setTimeout(resolve, this.delayMs));
      }
    }

    this.processing = false;
  }

  /**
   * Получить размер очереди
   */
  get size() {
    return this.queue.length;
  }

  /**
   * Очистить очередь
   */
  clear() {
    this.queue = [];
    this.processing = false;
  }
}

// Создаем глобальную очередь для API запросов
// Задержка 200ms между запросами (достаточно для 50 запросов за 10 секунд)
export const apiQueue = new RequestQueue(200);

export default RequestQueue;
