from django.db.models import signals
from django.utils.module_loading import autodiscover_modules

from .exceptions import AlreadyRegistered


class CacheRegistry:

    def __init__(self):
        self._registry = {}

    def register(self, serializer):
        """Store the serializer and model on registry to that the cache can be
        cleaned whenever an object is changed or deleted.
        After the serializer is registered we must connect the signals that
        clear the instance cache.
        """
        model = serializer.Meta.model

        if model not in self._registry:
            self._registry[model] = []

        if serializer in self._registry[model]:
            raise AlreadyRegistered("Serializer {} is already registered"
                                    .format(model.__name__))

        self._registry[model].append(serializer)
        self.connect_signals(model)

    def connect_signals(self, model):
        from .signals import clear_instance # NOQA - Prevent circular import

        signals.post_save.connect(clear_instance, sender=model)
        signals.pre_delete.connect(clear_instance, sender=model)

    def get(self, model):
        return self._registry.get(model, [])

    def autodiscover(self):
        autodiscover_modules('serializers')


# This global object represents the default CacheRegistry, for the common case.
# You can instantiate CacheRegistry in your own code to create a custom
# register.
cache_registry = CacheRegistry()