"""
Permissions для board модуля.
"""
from rest_framework import permissions


class IsBoardOwner(permissions.BasePermission):
    """
    Проверка что пользователь - владелец доски.
    """
    
    message = 'Только владелец доски может выполнить это действие.'
    
    def has_object_permission(self, request, view, obj):
        """Проверка доступа к объекту."""
        # Для Board
        if hasattr(obj, 'owner'):
            return obj.owner == request.user
        
        # Для BoardElement
        if hasattr(obj, 'board'):
            return obj.board.owner == request.user
        
        return False


class IsBoardOwnerOrParticipant(permissions.BasePermission):
    """
    Проверка что пользователь - владелец или участник доски.
    """
    
    message = 'У вас нет доступа к этой доске.'
    
    def has_object_permission(self, request, view, obj):
        """Проверка доступа к объекту."""
        # Для Board
        if hasattr(obj, 'has_access'):
            return obj.has_access(request.user)
        
        # Для BoardElement
        if hasattr(obj, 'board'):
            return obj.board.has_access(request.user)
        
        # Для BoardSnapshot
        if hasattr(obj, 'board'):
            return obj.board.has_access(request.user)
        
        return False


class IsBoardOwnerOrReadOnly(permissions.BasePermission):
    """
    Владелец может редактировать, остальные - только чтение.
    """
    
    def has_object_permission(self, request, view, obj):
        """Проверка доступа к объекту."""
        # Чтение разрешено всем с доступом
        if request.method in permissions.SAFE_METHODS:
            if hasattr(obj, 'has_access'):
                return obj.has_access(request.user)
            if hasattr(obj, 'board'):
                return obj.board.has_access(request.user)
        
        # Редактирование только владельцу
        if hasattr(obj, 'owner'):
            return obj.owner == request.user
        if hasattr(obj, 'board'):
            return obj.board.owner == request.user
        
        return False

