"""Manages settings for the categories application."""

import collections

from django.conf import settings
from django.db.models import Q
from django.utils.translation import gettext_lazy as _

DEFAULT_SETTINGS = {
    "ALLOW_SLUG_CHANGE": False,
    "M2M_REGISTRY": {},
    "FK_REGISTRY": {},
    "THUMBNAIL_UPLOAD_PATH": "uploads/categories/thumbnails",
    "THUMBNAIL_STORAGE": settings.DEFAULT_FILE_STORAGE,
    "THUMBNAIL_STORAGE_ALIAS": "default",
    "JAVASCRIPT_URL": getattr(settings, "STATIC_URL", settings.MEDIA_URL) + "js/",
    "SLUG_TRANSLITERATOR": "",
    "REGISTER_ADMIN": True,
    "RELATION_MODELS": [],
}

DEFAULT_SETTINGS.update(getattr(settings, "CATEGORIES_SETTINGS", {}))

if DEFAULT_SETTINGS["SLUG_TRANSLITERATOR"]:
    if isinstance(DEFAULT_SETTINGS["SLUG_TRANSLITERATOR"], collections.Callable):
        pass
    elif isinstance(DEFAULT_SETTINGS["SLUG_TRANSLITERATOR"], str):
        from django.utils.importlib import import_module

        bits = DEFAULT_SETTINGS["SLUG_TRANSLITERATOR"].split(".")
        module = import_module(".".join(bits[:-1]))
        DEFAULT_SETTINGS["SLUG_TRANSLITERATOR"] = getattr(module, bits[-1])
    else:
        from django.core.exceptions import ImproperlyConfigured

        raise ImproperlyConfigured(
            _("%(transliterator) must be a callable or a string.") % {"transliterator": "SLUG_TRANSLITERATOR"}
        )
else:
    DEFAULT_SETTINGS["SLUG_TRANSLITERATOR"] = lambda x: x


# Add all the keys/values to the module's namespace
globals().update(DEFAULT_SETTINGS)

RELATIONS = [Q(app_label=al, model=m) for al, m in [x.split(".") for x in DEFAULT_SETTINGS["RELATION_MODELS"]]]

# The field registry keeps track of the individual fields created.
#  {'app.model.field': Field(**extra_params)}
#  Useful for doing a schema migration
FIELD_REGISTRY = {}

# The model registry keeps track of which models have one or more fields
# registered.
# {'app': [model1, model2]}
# Useful for admin alteration
MODEL_REGISTRY = {}
