"""Alumni profile domain signals.

Following the pattern used by ``apps/rep/courses/signals.py`` — custom
``django.dispatch.Signal`` objects are emitted from the service layer so
receivers (tracking, engagement, M&EL) can subscribe without coupling.
"""
from __future__ import annotations

import logging

import django.dispatch
from django.db.models.signals import post_save
from django.dispatch import receiver

logger = logging.getLogger(__name__)

alumni_profile_created = django.dispatch.Signal()
"""Sent when an AlumniProfile is created from any handoff source.

kwargs: ``profile`` (AlumniProfile), ``source`` (AlumniSource value).
"""

alumni_profile_visibility_changed = django.dispatch.Signal()
"""Sent when visibility_consent flips.

kwargs: ``profile``, ``is_published`` (bool).
"""


def _enqueue_embed(profile_id: int) -> None:
    try:
        from apps.alumni.tasks import embed_profile_async

        embed_profile_async.delay(profile_id)
    except Exception:  # pragma: no cover - defensive (Celery unavailable)
        logger.debug("alumni.embedding enqueue skipped profile=%s", profile_id, exc_info=True)


@receiver(post_save, sender="alumni_profiles.AlumniProfile")
def _profile_changed_enqueue_embed(sender, instance, created, **kwargs):
    _enqueue_embed(instance.pk)


@receiver(post_save, sender="alumni_profiles.Employment")
def _employment_changed_enqueue_embed(sender, instance, created, **kwargs):
    _enqueue_embed(instance.profile_id)


@receiver(post_save, sender="alumni_profiles.Publication")
def _publication_changed_enqueue_embed(sender, instance, created, **kwargs):
    _enqueue_embed(instance.profile_id)


@receiver(post_save, sender="alumni_profiles.Degree")
def _degree_changed_enqueue_embed(sender, instance, created, **kwargs):
    _enqueue_embed(instance.profile_id)
