"""Alumni tracking receivers.

Thin handlers that delegate to services. Mirrors the
``apps/mel/tracking/receivers.py`` pattern.
"""
from __future__ import annotations

import logging

from django.dispatch import receiver

from apps.alumni.profiles.signals import (
    alumni_profile_created,
    alumni_profile_visibility_changed,
)

logger = logging.getLogger(__name__)


@receiver(alumni_profile_created, dispatch_uid="alumni.tracking.seed_graduation_milestone")
def seed_graduation_milestone(sender, profile=None, source=None, **kwargs):
    """Insert a GRADUATION milestone for newly created profiles."""
    if profile is None:
        return
    earliest = profile.degrees.order_by("graduated_on").first()
    if earliest is None:
        return
    from apps.alumni.tracking.models import CareerMilestone, MilestoneType

    CareerMilestone.objects.get_or_create(
        profile=profile,
        milestone_type=MilestoneType.GRADUATION,
        occurred_on=earliest.graduated_on,
        defaults={
            "title": f"Graduated — {earliest.programme_name}",
            "description": earliest.thesis_title or "",
        },
    )


@receiver(
    alumni_profile_visibility_changed,
    dispatch_uid="alumni.tracking.visibility_welcome",
)
def visibility_welcome(sender, profile=None, is_published=False, **kwargs):
    if not profile or not is_published:
        return
    try:
        from apps.core.notifications.models import Notification
        from apps.core.notifications.services import send_notification

        send_notification(
            profile.user,
            "Your alumni profile is now visible in the public directory.",
            verb=Notification.Verb.ALUMNI_PROFILE_CREATED,
        )
    except Exception:  # pragma: no cover - defensive
        logger.exception("alumni.tracking visibility notify failed profile=%s", profile.pk)
