import copy

from . import buildacl
from .cache import get_acl_cache, set_acl_cache
from .providers import providers


def get_user_acl(user, cache_versions):
    user_acl = get_acl_cache(user, cache_versions)
    if user_acl is None:
        user_acl = buildacl.build_acl(user.get_roles())
        set_acl_cache(user, cache_versions, user_acl)
    user_acl["user_id"] = user.id
    user_acl["is_authenticated"] = bool(user.is_authenticated)
    user_acl["is_anonymous"] = bool(user.is_anonymous)
    user_acl["is_staff"] = user.is_staff
    user_acl["is_superuser"] = user.is_superuser
    user_acl["cache_versions"] = cache_versions.copy()
    return user_acl


def serialize_user_acl(user_acl):
    """serialize authenticated user's ACL"""
    serialized_acl = copy.deepcopy(user_acl)
    serialized_acl.pop("cache_versions")

    for serializer in providers.get_user_acl_serializers():
        serializer(serialized_acl)

    return serialized_acl