import json
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response
from accounts.models import Users
from .models import Chat, Chat_Images
from django.db.models import Q, Subquery, OuterRef
from .serializers import ChatSerializer
from utils.helpers import verify_token


class ChatsView(APIView):
    def get(self, request):

        user_id = verify_token(request)

        if user_id is None:
            return Response({
                'message': "User not logged in",
                'status': status.HTTP_401_UNAUTHORIZED
            })

        try:
            chats = Chat.objects.filter(
                id__in=Subquery(
                    Users.objects.filter(
                        Q(sender_message__receiver=user_id) |
                        Q(receiver_message__sender=user_id)
                    ).distinct().annotate(
                        last_msg=Subquery(
                            Chat.objects.filter(
                                Q(sender=OuterRef('id'), receiver=user_id) |
                                Q(receiver=OuterRef('id'), sender=user_id)
                            ).order_by('-created_at').values_list('id', flat=True)[:1]
                        )
                    ).values_list('last_msg', flat=True)
                )
            ).order_by('-created_at')

            
            work_id = request.GET.get('work_id')
            sub_category_id = request.GET.get('sub_category_id')

            # ✅ correct filters
            if work_id:
                chats = chats.filter(work_id=work_id)

            if sub_category_id:
                chats = chats.filter(work_sub_category_id=sub_category_id)


            serializer = ChatSerializer(
                chats,
                many=True,
                context={'user_id': user_id}
            )

            return Response({
                'chats': serializer.data,
                'status': status.HTTP_200_OK
            })

        except Exception as e:
            print(e)
            return Response({
                'message': "Something went wrong.",
                'status': status.HTTP_500_INTERNAL_SERVER_ERROR
            })



class ChatView(APIView):
    def post(self, request):
        user_id = verify_token(request)
        if user_id == None:
            return Response({'message' : "User not logged in", 'status':status.HTTP_401_UNAUTHORIZED}) 
        else:
            try:
                request_data = json.loads(request.body)
                chat_user = request_data['user_id']
                chats = Chat.objects.filter(Q(sender_id = user_id, receiver_id = chat_user, work_id = request_data['work_id'], work_sub_category_id = request_data['work_sub_category_id']) | Q(sender_id = chat_user, receiver_id = user_id, work_id = request_data['work_id'], work_sub_category_id = request_data['work_sub_category_id'])).order_by('created_at')
                serializer = ChatSerializer(chats, many=True, context = {'user_id' : user_id})
                Chat.objects.filter(Q(sender_id = chat_user) & Q(receiver_id = user_id)).update(status = 1)
                return Response({'chats' : serializer.data, 'status':status.HTTP_200_OK})
            except Exception as e:
                print(e)
                return Response({'message' : "Somwthing went wrong.", 'status':status.HTTP_500_INTERNAL_SERVER_ERROR})



class ChatImageView(APIView):
    def post(self, request):
        user_id = verify_token(request)
        if user_id == None:
            return Response({'message' : "User not logged in", 'status':status.HTTP_401_UNAUTHORIZED}) 
        else:
            try:
                chat_image = Chat_Images()
                chat_image.image = request.FILES['image']
                chat_image.save()
                return Response({'image' : str(chat_image.image), 'status':status.HTTP_200_OK})
            except Exception as e:
                return Response({'message' : "Something went wrong.", 'status':status.HTTP_500_INTERNAL_SERVER_ERROR})

