package com.crm.ucard.util;

import com.google.common.util.concurrent.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 接口调用频率限制工具类
 * 使用 Guava 的 RateLimiter 实现令牌桶算法
 */
@Slf4j
@Component
public class RateLimiterUtil {
    
    private final Map<String, RateLimiter> rateLimiters = new ConcurrentHashMap<>();
    
    /**
     * 获取接口的限流器
     * @param apiName 接口名称
     * @param permitsPerSecond 每秒允许的请求数
     * @return RateLimiter 限流器
     */
    private RateLimiter getRateLimiter(String apiName, double permitsPerSecond) {
        return rateLimiters.computeIfAbsent(apiName, k -> RateLimiter.create(permitsPerSecond));
    }
    
    /**
     * 尝试获取令牌
     * @param apiName 接口名称
     * @param permitsPerSecond 每秒允许的请求数
     * @return 是否获取成功
     */
    public boolean tryAcquire(String apiName, double permitsPerSecond) {
        try {
            return getRateLimiter(apiName, permitsPerSecond).tryAcquire();
        } catch (Exception e) {
            log.error("Rate limiter error for API: {}", apiName, e);
            return true; // 发生异常时默认允许请求
        }
    }
} 