"""Signal receivers for the MEL indicators submodule."""
from __future__ import annotations

import logging

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

logger = logging.getLogger(__name__)


def _purge_attachments_for(sender, instance):
    """Best-effort: delete all EvidenceAttachment rows that point at ``instance``.

    Generic FKs don't propagate Django's cascade — without this receiver an
    EvidenceAttachment would orphan when its host is deleted.
    """
    from django.contrib.contenttypes.models import ContentType

    from apps.mel.indicators.models import EvidenceAttachment

    try:
        ct = ContentType.objects.get_for_model(sender)
    except Exception:  # pragma: no cover - defensive
        return
    qs = EvidenceAttachment.objects.filter(content_type=ct, object_id=instance.pk)
    count = qs.count()
    if count:
        qs.delete()
        logger.info(
            "mel.evidence pre-delete cascade host=%s.%s pk=%s purged=%s",
            sender._meta.app_label, sender.__name__, instance.pk, count,
        )


def _install_evidence_cascade_receivers() -> None:
    """Wire ``pre_delete`` receivers for every host model carrying evidence."""
    from apps.mel.indicators.models import DataPoint, Indicator  # local — avoid import cycle

    pre_delete.connect(_pre_delete_datapoint, sender=DataPoint, weak=False)
    pre_delete.connect(_pre_delete_indicator, sender=Indicator, weak=False)

    try:
        from apps.mel.tracking.models import Activity, OutputDeliverable

        pre_delete.connect(_pre_delete_activity, sender=Activity, weak=False)
        pre_delete.connect(_pre_delete_output, sender=OutputDeliverable, weak=False)
    except ImportError:  # pragma: no cover - apps optional in some test envs
        pass

    try:
        from apps.mel.feedback.models import FeedbackSubmission

        pre_delete.connect(
            _pre_delete_feedback, sender=FeedbackSubmission, weak=False,
        )
    except ImportError:  # pragma: no cover
        pass


@receiver(pre_delete)
def _noop(sender, instance, **kwargs):
    """Placeholder so the signals module always imports cleanly."""
    return None


def _pre_delete_datapoint(sender, instance, **kwargs):
    _purge_attachments_for(sender, instance)


def _pre_delete_indicator(sender, instance, **kwargs):
    _purge_attachments_for(sender, instance)


def _pre_delete_activity(sender, instance, **kwargs):
    _purge_attachments_for(sender, instance)


def _pre_delete_output(sender, instance, **kwargs):
    _purge_attachments_for(sender, instance)


def _pre_delete_feedback(sender, instance, **kwargs):
    _purge_attachments_for(sender, instance)
