/**
 * Rate Limiter Utility
 * 
 * Kullanıcı başına rate limiting sağlar.
 * Production'da Redis kullanılması önerilir.
 */

interface RateLimitEntry {
  count: number;
  resetTime: number;
}

class RateLimiter {
  private limits: Map<string, RateLimitEntry>;

  constructor() {
    this.limits = new Map();
  }

  /**
   * Rate limit kontrolü yapar
   * @param key - Unique key (örn: "trip_create_user123")
   * @param maxRequests - Maksimum istek sayısı
   * @param windowMs - Zaman penceresi (milisaniye)
   * @throws Error - Limit aşıldığında
   */
  check(key: string, maxRequests: number, windowMs: number = 3600000): void {
    const now = Date.now();
    const entry = this.limits.get(key);

    if (!entry || now > entry.resetTime) {
      // Yeni pencere başlat
      this.limits.set(key, {
        count: 1,
        resetTime: now + windowMs
      });
      return;
    }

    if (entry.count >= maxRequests) {
      const remainingTime = Math.ceil((entry.resetTime - now) / 60000); // dakika
      throw new Error(`Saatlik limit aşıldı. ${remainingTime} dakika sonra tekrar deneyin.`);
    }

    entry.count++;
    this.limits.set(key, entry);
  }

  /**
   * Belirli bir key için limiti sıfırlar
   * @param key - Unique key
   */
  reset(key: string): void {
    this.limits.delete(key);
  }

  /**
   * Tüm limitleri temizler
   */
  clear(): void {
    this.limits.clear();
  }

  /**
   * Kalan istek sayısını döner
   * @param key - Unique key
   * @param maxRequests - Maksimum istek sayısı
   * @returns Kalan istek sayısı
   */
  remaining(key: string, maxRequests: number): number {
    const entry = this.limits.get(key);
    if (!entry) return maxRequests;
    
    const now = Date.now();
    if (now > entry.resetTime) return maxRequests;
    
    return Math.max(0, maxRequests - entry.count);
  }

  /**
   * Limit sıfırlanma zamanını döner
   * @param key - Unique key
   * @returns Sıfırlanma zamanı (timestamp) veya null
   */
  resetTime(key: string): number | null {
    const entry = this.limits.get(key);
    if (!entry) return null;
    
    const now = Date.now();
    if (now > entry.resetTime) return null;
    
    return entry.resetTime;
  }
}

// Singleton instance
export const rateLimiter = new RateLimiter();

/**
 * Kullanım Örnekleri:
 * 
 * // Basit kullanım
 * rateLimiter.check('trip_create_user123', 5, 3600000); // 5 istek/saat
 * 
 * // Kalan istek sayısını kontrol et
 * const remaining = rateLimiter.remaining('trip_create_user123', 5);
 * console.log(`Kalan istek: ${remaining}`);
 * 
 * // Sıfırlanma zamanını kontrol et
 * const resetTime = rateLimiter.resetTime('trip_create_user123');
 * if (resetTime) {
 *   const minutes = Math.ceil((resetTime - Date.now()) / 60000);
 *   console.log(`${minutes} dakika sonra sıfırlanacak`);
 * }
 * 
 * // Manuel sıfırlama (test için)
 * rateLimiter.reset('trip_create_user123');
 */
