from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed to any request,
        # so we'll always allow GET, HEAD or OPTIONS requests.
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions are only allowed to the owner of the object.
        return obj.user_id == request.user


class IsPublicReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow read-only access to public objects,
    and write access to the owner of the object.
    """

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed if the object is public
        if request.method in permissions.SAFE_METHODS:
            return obj.is_public or obj.user_id == request.user

        # Write permissions are only allowed to the owner of the object
        return obj.user_id == request.user
    
class CollectionShared(permissions.BasePermission):
    """
    Custom permission to only allow read-only access to public objects,
    and write access to the owner of the object.
    """

    def has_object_permission(self, request, view, obj):

        # Read permissions are allowed if the object is shared with the user
        if obj.shared_with and obj.shared_with.filter(id=request.user.id).exists():
            return True
        
        # Write permissions are allowed if the object is shared with the user
        if request.method not in permissions.SAFE_METHODS and obj.shared_with.filter(id=request.user.id).exists():
            return True

        # Read permissions are allowed if the object is public
        if request.method in permissions.SAFE_METHODS:
            return obj.is_public or obj.user_id == request.user

        # Write permissions are only allowed to the owner of the object
        return obj.user_id == request.user

class IsOwnerOrSharedWithFullAccess(permissions.BasePermission):
    """
    Custom permission to allow:
    - Full access for shared users
    - Full access for owners
    - Read-only access for others on safe methods
    """

    def has_object_permission(self, request, view, obj):
        
        # Allow GET only for a public object
        if request.method in permissions.SAFE_METHODS and obj.is_public:
            return True
        # Check if the object has a collection
        if hasattr(obj, 'collection') and obj.collection:
            # Allow all actions for shared users
            if request.user in obj.collection.shared_with.all():
                return True

        # Always allow GET, HEAD, or OPTIONS requests (safe methods)
        if request.method in permissions.SAFE_METHODS:
            return True

        # Allow all actions for the owner
        return obj.user_id == request.user