from django.db.models import Count
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.response import Response
from categories.models import Category
from .serializers import CategorySerializer, CategoryCreateSerializer
from follows.models import FollowCategory


@api_view(['POST'])
@permission_classes([IsAuthenticated])
def create_category(request):
    serializer = CategoryCreateSerializer(data=request.data)
    if serializer.is_valid():
        category = Category.objects.create(
            created_by=request.user,
            **serializer.validated_data
        )
        # Re-fetch with annotations for consistent response
        category = Category.objects.annotate(
            followers_count=Count('followed_by', distinct=True),
            posts_count=Count('posts', distinct=True)
        ).get(id=category.id)
        return Response(CategorySerializer(category, context={'request': request}).data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def list_categories(request):
    created_by = request.query_params.get('created_by')
    categories = Category.objects.annotate(
        followers_count=Count('followed_by', distinct=True),
        posts_count=Count('posts', distinct=True)
    )

    if created_by:
        categories = categories.filter(created_by_id=created_by)

    categories = categories.order_by('-posts_count', '-created_at')
    serializer = CategorySerializer(categories, many=True, context={'request': request})
    return Response(serializer.data)


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def category_detail(request, category_id):
    try:
        category = Category.objects.annotate(
            followers_count=Count('followed_by', distinct=True),
            posts_count=Count('posts', distinct=True)
        ).get(id=category_id)
        serializer = CategorySerializer(category, context={'request': request})
        data = serializer.data

        from saved.models import SavedCategory
        data['is_saved'] = SavedCategory.objects.filter(user=request.user, category=category).exists()

        return Response(data)
    except Category.DoesNotExist:
        return Response({'error': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)


@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def update_category(request, category_id):
    try:
        category = Category.objects.get(id=category_id)

        # Vérifier que l'utilisateur est le créateur de la catégorie
        if category.created_by != request.user:
            return Response({'error': 'Permission denied'}, status=status.HTTP_403_FORBIDDEN)

        serializer = CategoryCreateSerializer(category, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(CategorySerializer(category).data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    except Category.DoesNotExist:
        return Response({'error': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)


@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
def delete_category(request, category_id):
    try:
        category = Category.objects.get(id=category_id)

        # Vérifier que l'utilisateur est le créateur de la catégorie
        if category.created_by != request.user:
            return Response({'error': 'Permission denied'}, status=status.HTTP_403_FORBIDDEN)

        category.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
    except Category.DoesNotExist:
        return Response({'error': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)


@api_view(['POST'])
@permission_classes([IsAuthenticated])
def follow_category(request, category_id):
    try:
        category = Category.objects.get(id=category_id)

        # Vérifier que l'utilisateur ne suit pas déjà cette catégorie
        if FollowCategory.objects.filter(user=request.user, category=category).exists():
            return Response({'error': 'You are already following this category'}, status=status.HTTP_400_BAD_REQUEST)

        FollowCategory.objects.create(user=request.user, category=category)
        return Response({'message': 'Category followed successfully'}, status=status.HTTP_201_CREATED)
    except Category.DoesNotExist:
        return Response({'error': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)


@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
def unfollow_category(request, category_id):
    try:
        category = Category.objects.get(id=category_id)
        follow = FollowCategory.objects.filter(user=request.user, category=category)

        if not follow.exists():
            return Response({'error': 'You are not following this category'}, status=status.HTTP_400_BAD_REQUEST)

        follow.delete()
        return Response({'message': 'Category unfollowed successfully'}, status=status.HTTP_200_OK)
    except Category.DoesNotExist:
        return Response({'error': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)


@api_view(['GET'])
@permission_classes([AllowAny])
def trending_categories(request):
    """
    Retourne les catégories tendances basées sur l'activité (followers + posts)
    """
    from django.db.models import Count, F

    categories = Category.objects.annotate(
        followers_count=Count('followed_by', distinct=True),
        posts_count=Count('posts', distinct=True)
    ).annotate(
        popularity=F('followers_count') + F('posts_count')
    ).order_by('-popularity')[:10]  # Top 10

    serializer = CategorySerializer(categories, many=True, context={'request': request})
    return Response(serializer.data)
