"""
Consumers module for the chat app.
"""

from channels.db import database_sync_to_async
from channels.generic.websocket import AsyncJsonWebsocketConsumer

from ecapp.models import Notificaciones
from users.models import User

from .models import Message


class ChatConsumer(AsyncJsonWebsocketConsumer):
    """
    Consumer for the chat websocket.
    """

    room_name = None
    room_group_name = None

    async def connect(self):
        self.room_name = self.scope["user"].pk
        self.room_group_name = f"user_{self.room_name}"

        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name,
        )

        await self.accept()

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

    async def receive_json(self, content, **kwargs):
        receiver = await database_sync_to_async(User.objects.get)(
            pk=content["receiver"],
        )
        message = content["message"]
        sender = self.scope["user"]

        message = await database_sync_to_async(Message.objects.create)(
            sender=sender,
            recipient=receiver,
            content=message,
        )
        await database_sync_to_async(Notificaciones.objects.create)(
            tipo=2,
            id_objeto=message.id,
            text=sender.username + " le envio un mensaje.",
            user_from=sender,
            user_to=receiver,
        )

        await self.channel_layer.group_send(
            f"user_{receiver.pk}",
            {"type": "chat_message", "data": content},
        )

    async def chat_message(self, event):
        """
        Send chat message.
        """
        await self.send_json(content=event["data"])
