from django.contrib.auth import get_user_model
from django.db import transaction
from django.db.models.signals import post_delete, post_save

from crm.models import Activity, Contact, Lead

from .cache import invalidate_finder_cache
from .models import AccessProfile, AccessRule, School


def _schedule_finder_cache_invalidation(sender, **kwargs):
    transaction.on_commit(invalidate_finder_cache)


def connect_finder_cache_signals():
    senders = (School, Lead, Activity, Contact, AccessProfile, AccessRule, get_user_model())
    for sender in senders:
        label = sender._meta.label_lower.replace(".", "_")
        post_save.connect(
            _schedule_finder_cache_invalidation,
            sender=sender,
            dispatch_uid=f"schools.invalidate_finder_cache.{label}.save",
        )
        post_delete.connect(
            _schedule_finder_cache_invalidation,
            sender=sender,
            dispatch_uid=f"schools.invalidate_finder_cache.{label}.delete",
        )