from __future__ import annotations

from functools import wraps

from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied

from .utils import has_any_role, is_staff_or_admin, is_super_admin


def role_required(*roles: str):
    def decorator(view_func):
        @login_required
        @wraps(view_func)
        def _wrapped_view(request, *args, **kwargs):
            if has_any_role(request.user, roles):
                return view_func(request, *args, **kwargs)
            raise PermissionDenied("You do not have permission to access this page.")

        return _wrapped_view

    return decorator


def super_admin_required(view_func):
    @login_required
    @wraps(view_func)
    def _wrapped_view(request, *args, **kwargs):
        if is_super_admin(request.user):
            return view_func(request, *args, **kwargs)
        raise PermissionDenied("Super-admin permission required.")

    return _wrapped_view


def staff_or_admin_required(view_func):
    @login_required
    @wraps(view_func)
    def _wrapped_view(request, *args, **kwargs):
        if is_staff_or_admin(request.user):
            return view_func(request, *args, **kwargs)
        raise PermissionDenied("Administrator permission required.")

    return _wrapped_view
