import { Ratelimit } from "@upstash/ratelimit";
import type { GlobalRateLimiter } from "@trigger.dev/redis-worker";
import { RateLimiter } from "~/services/rateLimiter.server";

/**
 * Creates a global rate limiter for the batch queue that limits
 * the maximum number of items processed per second across all consumers.
 *
 * Uses a token bucket algorithm where:
 * - `itemsPerSecond` tokens are available per second
 * - The bucket can hold up to `itemsPerSecond` tokens (burst capacity)
 *
 * @param itemsPerSecond - Maximum items to process per second
 * @returns A GlobalRateLimiter compatible with FairQueue
 */
export function createBatchGlobalRateLimiter(itemsPerSecond: number): GlobalRateLimiter {
  const limiter = new RateLimiter({
    keyPrefix: "batch-queue-global",
    // Token bucket: refills `itemsPerSecond` tokens every second
    // Bucket capacity is also `itemsPerSecond` (allows burst up to limit)
    limiter: Ratelimit.tokenBucket(itemsPerSecond, "1 s", itemsPerSecond),
    logSuccess: false,
    logFailure: true,
  });

  return {
    async limit() {
      const result = await limiter.limit("global");
      return {
        allowed: result.success,
        resetAt: result.reset,
      };
    },
  };
}
