from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from follows.models import FollowUser, FollowCategory
from .serializers import FollowUserSerializer, FollowCategorySerializer


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_user_followers(request, user_id):
    from users.models import User
    try:
        target_user = User.objects.get(id=user_id)
    except User.DoesNotExist:
        return Response({'error': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

    # Privacy check
    if target_user.is_private and target_user != request.user:
        is_following = FollowUser.objects.filter(follower=request.user, followed=target_user).exists()
        if not is_following:
            return Response({'error': 'Cet compte est privé. Suivez cet utilisateur pour voir ses abonnés.'}, status=status.HTTP_403_FORBIDDEN)

    follows = FollowUser.objects.filter(followed_id=user_id)

    # Pagination
    paginator = PageNumberPagination()
    paginator.page_size = 20
    result_page = paginator.paginate_queryset(follows, request)

    serializer = FollowUserSerializer(result_page, many=True)
    return paginator.get_paginated_response(serializer.data)


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_user_following(request, user_id):
    from users.models import User
    try:
        target_user = User.objects.get(id=user_id)
    except User.DoesNotExist:
        return Response({'error': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

    # Privacy check
    if target_user.is_private and target_user != request.user:
        is_following = FollowUser.objects.filter(follower=request.user, followed=target_user).exists()
        if not is_following:
            return Response({'error': 'Cet compte est privé. Suivez cet utilisateur pour voir ses abonnements.'}, status=status.HTTP_403_FORBIDDEN)

    follows = FollowUser.objects.filter(follower_id=user_id)

    # Pagination
    paginator = PageNumberPagination()
    paginator.page_size = 20
    result_page = paginator.paginate_queryset(follows, request)

    serializer = FollowUserSerializer(result_page, many=True)
    return paginator.get_paginated_response(serializer.data)


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_category_followers(request, category_id):
    follows = FollowCategory.objects.filter(category_id=category_id)

    # Pagination
    paginator = PageNumberPagination()
    paginator.page_size = 20
    result_page = paginator.paginate_queryset(follows, request)

    serializer = FollowCategorySerializer(result_page, many=True)
    return paginator.get_paginated_response(serializer.data)


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_user_followed_categories(request, user_id):
    from users.models import User
    try:
        target_user = User.objects.get(id=user_id)
    except User.DoesNotExist:
        return Response({'error': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

    # Privacy check
    if target_user.is_private and target_user != request.user:
        is_following = FollowUser.objects.filter(follower=request.user, followed=target_user).exists()
        if not is_following:
            return Response({'error': 'Cet compte est privé. Suivez cet utilisateur pour voir ses catégories suivies.'}, status=status.HTTP_403_FORBIDDEN)

    follows = FollowCategory.objects.filter(user_id=user_id)

    # Pagination
    paginator = PageNumberPagination()
    paginator.page_size = 20
    result_page = paginator.paginate_queryset(follows, request)

    serializer = FollowCategorySerializer(result_page, many=True)
    return paginator.get_paginated_response(serializer.data)