import logging
from django.dispatch import receiver
from .event_bus import event_signal

logger = logging.getLogger(__name__)


def _match_event(kwargs, name):
    return kwargs.get('event_name') == name


@receiver(event_signal)
def _default_listener(sender, **kwargs):
    # a generic listener that logs events; keeps the signal chain alive
    event_name = kwargs.get('event_name')
    payload = kwargs.get('payload')
    logger.debug('Event received: %s %s', event_name, payload)


# Example specific listeners
@receiver(event_signal)
def on_user_registered(sender, **kwargs):
    if not _match_event(kwargs, 'user_registered'):
        return
    payload = kwargs.get('payload') or {}
    user_id = payload.get('user_id')
    logger.info('User registered event for user_id=%s', user_id)
    # Try to import optional welcome-email sender to avoid hard dependency
    try:
        from apps.platform.notifications.services import send_notification

        # send a welcome notification (non-blocking intent)
        send_notification(channel='email', recipient=payload.get('email') or '', template_code='welcome_email', context=payload)
    except Exception:
        logger.debug('notifications.send_notification not available or failed', exc_info=True)
    # also log audit if available
    try:
        from apps.platform.audit.services.audit_service import log_event
        log_event(action='user_registered', entity_type='User', entity_id=user_id, request=kwargs.get('request'), metadata=payload)
    except Exception:
        logger.debug('audit.log_event not available or failed', exc_info=True)


@receiver(event_signal)
def on_otp_sent(sender, **kwargs):
    if not _match_event(kwargs, 'otp_sent'):
        return
    payload = kwargs.get('payload') or {}
    mobile = payload.get('mobile') or payload.get('recipient')
    logger.info('OTP sent event for mobile=%s', mobile)
    try:
        from apps.platform.notifications.services import send_notification
        send_notification(channel='sms', recipient=mobile, template_code='otp_sms', context=payload)
    except Exception:
        logger.debug('notifications.send_notification not available or failed', exc_info=True)
    try:
        from apps.platform.audit.services.audit_service import log_event
        log_event(action='otp_sent', entity_type='User', entity_id=payload.get('user_id'), request=kwargs.get('request'), metadata=payload)
    except Exception:
        logger.debug('audit.log_event not available or failed', exc_info=True)


@receiver(event_signal)
def on_payment_success(sender, **kwargs):
    if not _match_event(kwargs, 'payment_success'):
        return
    payload = kwargs.get('payload') or {}
    payment_id = payload.get('payment_id')
    logger.info('Payment success event for payment_id=%s', payment_id)
    try:
        from apps.platform.audit.services.audit_service import log_event
        log_event(action='payment_success', entity_type='PaymentTransaction', entity_id=payment_id, metadata=payload, request=kwargs.get('request'))
    except Exception:
        logger.debug('audit.log_event not available or failed', exc_info=True)
