import time
from collections import defaultdict
from threading import Lock

class RateLimiter:
    def __init__(self, max_requests=5, time_window=60):
        """
        max_requests: Maximum number of requests allowed
        time_window: Time window in seconds
        """
        self.max_requests = max_requests
        self.time_window = time_window
        self.requests = defaultdict(list)
        self.lock = Lock()
    
    def is_allowed(self, identifier):
        """Check if request is allowed for given identifier (e.g., IP address)"""
        with self.lock:
            current_time = time.time()
            
            # Remove old requests outside time window
            self.requests[identifier] = [
                req_time for req_time in self.requests[identifier]
                if current_time - req_time < self.time_window
            ]
            
            # Check if under limit
            if len(self.requests[identifier]) < self.max_requests:
                self.requests[identifier].append(current_time)
                return True
            
            return False
    
    def get_remaining_requests(self, identifier):
        """Get number of remaining requests"""
        with self.lock:
            current_time = time.time()
            self.requests[identifier] = [
                req_time for req_time in self.requests[identifier]
                if current_time - req_time < self.time_window
            ]
            return max(0, self.max_requests - len(self.requests[identifier]))
    
    def get_reset_time(self, identifier):
        """Get time until rate limit resets"""
        with self.lock:
            if not self.requests[identifier]:
                return 0
            
            current_time = time.time()
            oldest_request = min(self.requests[identifier])
            reset_time = oldest_request + self.time_window - current_time
            return max(0, reset_time)

# Global instance - allows 5 downloads per minute per IP
rate_limiter = RateLimiter(max_requests=5, time_window=60)