#Ten fragment kodu definiuje niestandardowe uprawnienia dla aplikacji Django REST Framework, które kontrolują dostęp do edycji wpisów i komentarzy oraz publikacji treści.

from rest_framework.permissions import BasePermission, SAFE_METHODS

#Niestandardowe uprawnienia dla aplikacji Django REST Framework: Kontrola dostępu do edycji wpisów i komentarzy oraz publikacji treści.
class IsAdminOrReadOnly(BasePermission):
    """
    Pozwala tylko adminom na modyfikacje (POST, PUT, PATCH, DELETE),
    reszta użytkowników ma tylko odczyt (GET, HEAD, OPTIONS).
    """
    def has_permission(self, request, view):
        if request.method in SAFE_METHODS:
            return True
        return request.user and request.user.is_authenticated and request.user.is_staff

class IsAuthorOrReadOnly(BasePermission):
    """
    Pozwala edytować tylko własny wpis/komentarz.
    """
    def has_object_permission(self, request, view, obj):
        if request.method in SAFE_METHODS:
            return True
        return obj.author == request.user

# Kontrola dostęu do publikacji treści.
class IsEditorOrAdmin(BasePermission):
    """
    Pozwala publikować treści tylko edytorom lub adminom.
    """
    def has_permission(self, request, view):
        return request.user.is_authenticated and request.user.role in ['admin', 'moderator']


class IsSelfOrAdmin(BasePermission):
    """
    Odczyt (GET/HEAD/OPTIONS): dozwolony dla wszystkich.
    Zapis (POST/PUT/PATCH/DELETE): tylko właściciel konta albo admin/staff/superuser.
    """

    def has_permission(self, request, view):
        # Odczyt – OK dla wszystkich
        if request.method in SAFE_METHODS:
            return True
        # Dla operacji modyfikujących – user musi być zalogowany
        return bool(request.user and request.user.is_authenticated)

    def has_object_permission(self, request, view, obj):
        # Odczyt – OK dla wszystkich
        if request.method in SAFE_METHODS:
            return True

        user = request.user
        if not user or not user.is_authenticated:
            return False

        # Admin/staff/superuser
        is_admin = getattr(user, 'is_superuser', False) or getattr(user, 'is_staff', False) \
                   or getattr(user, 'role', None) == 'admin'

        # Właściciel konta (obsługujemy zarówno User, jak i obiekty z polem user/owner/author)
        uid = getattr(user, 'id', None)
        is_owner = (
            obj is user or
            getattr(obj, 'id', None) == uid or
            getattr(obj, 'user_id', None) == uid or
            getattr(obj, 'owner_id', None) == uid or
            getattr(obj, 'author_id', None) == uid
        )

        return is_owner or is_admin