from django.shortcuts import render
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
from auth_apis.models import *
from store_apis.models import *
from .models import Chat
import json

class ChatView(APIView):
    def get(self, request, sender_id, receiver_id):
        sender = User.objects.get(id=sender_id)
        receiver = User.objects.get(id=receiver_id)
        channel_name = f"chat_{sender.id}_{receiver.id}"
        return Response({"channel_name": channel_name})

class SendMessageView(APIView):
    def post(self, request):
        sender_id = request.data.get("sender_id")
        print('sender_id',sender_id)
        receiver_id = request.data.get("receiver_id")
        message = request.data.get("message")
        sender = User.objects.get(pk=sender_id)
        print('sender',sender)
        receiver = User.objects.get(pk=receiver_id)
        print('receiver',receiver)
        channel_layer = get_channel_layer()
        channel_name = f"chat_{sender.id}_{receiver.id}"
        payload = {
            'type': 'send_message',
            'message': message,
            'sender': sender.id,
            'receiver':receiver.id
        }
        async_to_sync(channel_layer.group_send)(channel_name, payload)
        return Response({"success": True})

class ChatConsumer:
    def __init__(self, scope):
        self.scope = scope
        self.user = self.scope["user"]
        self.sender_id, self.recipient_id = self.scope["url_route"]["kwargs"]["channel_name"].split("_")[1:]
        self.channel_name = f"chat_{self.sender_id}_{self.recipient_id}"

    async def connect(self):
        await self.channel_layer.group_add(
            self.channel_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard(
            self.channel_name,
            self.channel_name
        )

    async def send_message(self, event):
        message = event['message']
        sender = event['sender']
        created_at = event['created_at']
        await self.send(json.dumps({
            'message': message,
            'sender': sender,
            'created_at': created_at
        }))


def chat(request, receiver_id,sender_id):
    # sender_id = request.user.id
    sender = User.objects.get(id=sender_id)
    receiver = User.objects.get(id=receiver_id)
    messages = Chat.objects.filter(sender=sender, receiver=receiver) | Chat.objects.filter(sender=receiver, receiver=sender)
    messages = messages.order_by('created_at')
    return render(request, 'chat.html', {
        'sender': sender,
        'receiver': receiver,
        'messages': messages
    })