from rest_framework.permissions import BasePermission
from users.models import Users


def is_superuser_or_required_role_or_read_only(
    request, required_role: str = None, required_roles: list = []
):
    user = request.user
    method = request.method

    # Check if the path is for archiving/unarching since it is also a GET method
    path = request.path
    is_action_archiving = any(action in path for action in ["/archive", "/unarchive"])

    if not is_action_archiving and method == "GET":
        return True

    if user.is_superuser:
        return True

    if required_role:
        return user.is_staff and user.role.title() == required_role

    if len(required_roles) > 0:
        return user.is_staff and user.role.title() in required_roles


class IsAdminOrReadOnly(BasePermission):
    def has_permission(self, request, view):
        method = request.method
        user = request.user

        if method == "GET":
            return True

        return bool(isinstance(user, Users) and (user.is_staff or user.is_superuser))


class IsShopManagerOrWebAdmin(BasePermission):
    def has_permission(self, request, view):
        return is_superuser_or_required_role_or_read_only(
            request=request, required_roles=["Shop Manager", "Web Admin"]
        )

"""IsShopManagerOrWebAdmin is being used instead"""
# class IsShopManager(BasePermission):
#     def has_permission(self, request, view):
#         return is_superuser_or_required_role_or_read_only(
#             request=request, required_role="Shop Manager"
#         )


class IsCopywriter(BasePermission):
    def has_permission(self, request, view):
        return is_superuser_or_required_role_or_read_only(
            request=request, required_role="Copywriter"
        )


class IsWebAdmin(BasePermission):
    def has_permission(self, request, view):
        return is_superuser_or_required_role_or_read_only(
            request=request, required_role="Web Admin"
        )
