from django.dispatch import Signal
import logging

logger = logging.getLogger(__name__)

# single Django signal used for all events
event_signal = Signal()


def emit_event(event_name: str, payload: dict = None):
    """Emit an application-level event.

    Other modules can listen to `event_signal` and filter by `event_name`.
    Example: emit_event('user_registered', {'user_id': user.id})
    """
    payload = payload or {}
    logger.debug('Emitting event %s: %s', event_name, payload)
    # send the django signal - receivers will get event_name and payload
    event_signal.send(sender=emit_event, event_name=event_name, payload=payload)


def register_listener(receiver_func):
    """Register a raw receiver to the underlying Django signal.

    The receiver should accept `sender`, `**kwargs` and look for
    `kwargs.get('event_name')` to filter events.
    """
    event_signal.connect(receiver_func)
    return receiver_func
