import importlib

from django.conf import settings
from django.core.exceptions import ImproperlyConfigured

from .conf import settings as rosetta_settings


def can_translate(user):
    return get_access_control_function()(user)


def get_access_control_function():
    """
    Return a predicate for determining if a user can
    access the Rosetta views
    """
    access_function = getattr(settings, "ROSETTA_ACCESS_CONTROL_FUNCTION", None)
    if access_function is None:
        return is_superuser_staff_or_in_translators_group
    elif isinstance(access_function, str):
        # Dynamically load a permissions function
        perm_module, perm_func = access_function.rsplit(".", 1)
        perm_module = importlib.import_module(perm_module)
        return getattr(perm_module, perm_func)
    elif callable(access_function):
        return access_function
    else:
        raise TypeError(access_function)


# Default access control test
def is_superuser_staff_or_in_translators_group(user):
    if not getattr(settings, "ROSETTA_REQUIRES_AUTH", True):
        return True
    try:
        if not user.is_authenticated:
            return False
        elif user.is_superuser and user.is_staff:
            return True
        else:
            return user.groups.filter(name="translators").exists()
    except AttributeError:
        if (
            not hasattr(user, "is_authenticated")
            or not hasattr(user, "is_superuser")
            or not hasattr(user, "groups")
        ):
            raise ImproperlyConfigured(
                "If you are using custom User Models you must implement a custom authentication method for Rosetta. See ROSETTA_ACCESS_CONTROL_FUNCTION here: https://django-rosetta.readthedocs.org/en/latest/settings.html"
            )
        raise


def can_translate_language(user, langid):
    try:
        if not rosetta_settings.ROSETTA_LANGUAGE_GROUPS:
            return can_translate(user)
        elif not user.is_authenticated:
            return False
        elif user.is_superuser and user.is_staff:
            return True
        else:
            return user.groups.filter(name="translators-%s" % langid).exists()

    except AttributeError:
        if (
            not hasattr(user, "is_authenticated")
            or not hasattr(user, "is_superuser")
            or not hasattr(user, "groups")
        ):
            raise ImproperlyConfigured(
                "If you are using custom User Models you must implement a custom authentication method for Rosetta. See ROSETTA_ACCESS_CONTROL_FUNCTION here: https://django-rosetta.readthedocs.org/en/latest/settings.html"
            )
        raise
