import logging

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

from apps.rims.scholarships.models import GraduationRecord

logger = logging.getLogger(__name__)


@receiver(post_save, sender=GraduationRecord)
def graduation_alumni_stub(sender, instance, created, **kwargs):
    if created:
        logger.info("alumni.handoff: graduation scholar_id=%s", instance.scholar_id)
        # PRD §4.3.4 — auto-transition the scholar to COMPLETED. Use a direct
        # update (not transition_scholar) so this never fails on a state-guard
        # mismatch (e.g. a scholar still in ENROLLED who never moved to ACTIVE)
        # and does not re-trigger the graduation cascade. We still write to
        # the audit log to keep FRFA-AM041 trails complete.
        try:
            from apps.core.audit.models import AuditLog
            from apps.rims.scholarships.models import Scholar

            scholar = Scholar.objects.filter(pk=instance.scholar_id).first()
            if scholar and scholar.status != Scholar.Status.COMPLETED:
                old = scholar.status
                from django.utils import timezone as _tz

                scholar.status = Scholar.Status.COMPLETED
                scholar.status_changed_at = _tz.now()
                scholar.save(update_fields=["status", "status_changed_at"])
                AuditLog.objects.create(
                    actor=None,
                    action="SCHOLAR_COMPLETED",
                    target_app="rims_scholarships",
                    target_model="Scholar",
                    object_id=str(scholar.pk),
                    object_repr=str(scholar)[:200],
                    changes={"from": old, "to": "completed", "via": "graduation_signal"},
                )
        except Exception:  # pragma: no cover - never roll back graduation
            logger.exception("scholar.auto_complete failed graduation_id=%s", instance.pk)
        try:
            from apps.mel.tracking.services import record_graduation

            record_graduation(instance)
        except Exception:  # pragma: no cover - do not roll back graduation on M&EL failure
            logger.exception("mel.record_graduation failed graduation_id=%s", instance.pk)
        try:
            from apps.alumni.profiles.services import create_from_graduation

            create_from_graduation(instance)
        except Exception:  # pragma: no cover - do not roll back graduation on alumni failure
            logger.exception("alumni.create_from_graduation failed graduation_id=%s", instance.pk)
