import asyncio
from collections import defaultdict

class QueueManager:
    def __init__(self):
        # Stores queues: user_id -> asyncio.Queue
        self.queues = defaultdict(asyncio.Queue)
        # Stores current tasks: user_id -> asyncio.Task (to allow cancellation)
        self.active_tasks = {}
        # Stores status to prevent multiple workers per user
        self.workers_running = defaultdict(bool)

    async def add(self, user_id, message_object):
        """Add a message (file) to the user's queue."""
        await self.queues[user_id].put(message_object)

    async def get_next(self, user_id):
        """Get next item from user queue."""
        if self.queues[user_id].empty():
            return None
        return await self.queues[user_id].get()

    def set_task(self, user_id, task):
        """Register the currently running task."""
        self.active_tasks[user_id] = task

    def clear_task(self, user_id):
        """Clear current task registry."""
        if user_id in self.active_tasks:
            del self.active_tasks[user_id]

    async def cancel_current(self, user_id):
        """Cancel the currently running upload/download."""
        task = self.active_tasks.get(user_id)
        if task and not task.done():
            task.cancel()
            return True
        return False

    def clear_queue(self, user_id):
        """Clear all pending items."""
        q = self.queues[user_id]
        count = q.qsize()
        while not q.empty():
            try:
                q.get_nowait()
                q.task_done()
            except asyncio.QueueEmpty:
                break
        return count

queue_manager = QueueManager()