package ru.ibs.socrates.confexporter.service.content.utils;

import com.google.common.util.concurrent.RateLimiter;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

/**
 * Перехватчик запросов Feign, ограничивающий частоту запросов с помощью Guava RateLimiter.
 * Этот перехватчик условно создается Spring только в том случае, если компонент этого типа
 *  еще не существует в контексте приложения.
 */
@ConditionalOnMissingBean
public class LimitInterceptor implements RequestInterceptor {

  /**
   * Экземпляр Guava RateLimiter, используемый для управления частотой запросов.
   */
  private final RateLimiter delegate;

  /**
   * Конструктор LimitInterceptor с указанным количеством разрешений в секунду.
   *
   * @param permitsPerSeconds Количество разрешений (запросов), разрешенных в секунду.
   * Должно быть положительным числом.
   * @throws IllegalArgumentException если permitsPerSeconds не является положительным числом.
   */
  public LimitInterceptor(Long permitsPerSeconds) {
    if (permitsPerSeconds <= 0) {
      throw new IllegalArgumentException("permitsPerSeconds должно быть положительным числом");
    }
    this.delegate = RateLimiter.create(permitsPerSeconds);
  }

  /**
   * Получает разрешение от RateLimiter перед каждым запросом Feign.
   * Если разрешение недоступно, поток будет заблокирован до тех пор, пока оно не станет доступно.
   *
   * @param template Объект RequestTemplate Feign.
   * Этот параметр не используется в данной реализации.
   */
  @Override
  public void apply(RequestTemplate template) {
    delegate.acquire();
  }
}
