import threading

class GlobalWorkPool:
    """Thread-safe pool of unassigned tasks that can be claimed by any node."""
    def __init__(self):
        self.lock = threading.Lock()
        self.available = {} # task_id -> payload
        self.on_new_work = None # Callback to notify nodes
    
    def push_work(self, task_id, payload):
        """Adds new task to global discovery pool."""
        with self.lock:
            self.available[task_id] = payload
            print(f"    [📦] New Shared Task: {task_id}")
        if self.on_new_work:
            self.on_new_work(task_id)

    def claim(self, task_id, node_id):
        """Allows a node to pull a specific task from the pool."""
        with self.lock:
            if task_id in self.available:
                print(f"    [📦] Task {task_id} Claimed by {node_id}")
                return True, self.available.pop(task_id)
            return False, None
    
    def list_available(self):
        """Returns IDs of all currently available unclaimed tasks."""
        with self.lock:
            return list(self.available.keys())
