import { RateLimitError } from "./errors";

interface RateLimitBucket {
  tokens: number;
  lastRefill: number;
}

const rateLimitStore = new Map<string, RateLimitBucket>();

export interface RateLimitOptions {
  key: string;
  maxTokens?: number; // Default 60 requests
  refillIntervalMs?: number; // Default 60 seconds (60,000ms)
}

/**
 * In-memory Token Bucket Rate Limiter per tenant/IP.
 */
export function checkRateLimit({ key, maxTokens = 60, refillIntervalMs = 60000 }: RateLimitOptions): void {
  const now = Date.now();
  let bucket = rateLimitStore.get(key);

  if (!bucket) {
    bucket = { tokens: maxTokens - 1, lastRefill: now };
    rateLimitStore.set(key, bucket);
    return;
  }

  // Calculate refilled tokens
  const elapsed = now - bucket.lastRefill;
  if (elapsed > refillIntervalMs) {
    bucket.tokens = maxTokens;
    bucket.lastRefill = now;
  }

  if (bucket.tokens <= 0) {
    const retryAfter = Math.ceil((refillIntervalMs - elapsed) / 1000);
    throw new RateLimitError(`Rate limit exceeded for ${key}. Please try again later.`, { retryAfterSeconds: retryAfter });
  }

  bucket.tokens -= 1;
}
