"""
Serializer module for the eccard app.
"""

from rest_framework import serializers

from chat.models import Inbox
from cards.models import Card
from cards.models import CardMetadata
from users.models import User

from .models import Notificaciones


class UserSerializer(serializers.ModelSerializer):
    """
    User serializer.
    """

    class Meta:
        model = User
        fields = "__all__"


class NotificacionesSerializer(serializers.ModelSerializer):
    """
    Notification serializer.
    """

    id_tarjeta = serializers.SerializerMethodField("get_id_tarjeta")

    def get_id_tarjeta(self, obj):  # pylint: disable=R0201
        """
        Get card id.
        """
        if obj.tipo == 3:
            tarjeta = Card.objects.get(
                usuario=obj.para,
                default=True,
            )
            id_tarjeta = tarjeta.id
        else:
            id_tarjeta = 0

        return id_tarjeta

    class Meta:
        model = Notificaciones
        fields = [
            "id",
            "tipo",
            "id_objeto",
            "text",
            "user_from",
            "user_to",
            "visto",
            "id_tarjeta",
        ]


class SearchTarjetaSerializers(serializers.ModelSerializer):
    """
    Search card serializer.
    """

    tarjeta = serializers.SerializerMethodField("get_tarjeta")
    nombre = serializers.SerializerMethodField("get_nombre")
    puesto = serializers.SerializerMethodField("get_puesto")
    descripcion = serializers.SerializerMethodField("get_descripcion")
    username = serializers.SerializerMethodField("get_username")

    def get_tarjeta(self, obj):  # pylint: disable=R0201
        """
        Get card's front.
        """
        return obj.tarjeta.image

    def get_nombre(self, obj):  # pylint: disable=R0201
        """
        Get card's name.
        """
        return obj.tarjeta.nombre

    def get_puesto(self, obj):  # pylint: disable=R0201
        """
        Get card position.
        """
        return obj.tarjeta.puesto

    def get_descripcion(self, obj):  # pylint: disable=R0201
        """
        Get card description.
        """
        return obj.descripcion_productos_servicios

    def get_username(self, obj):  # pylint: disable=R0201
        """
        Get card user's username.
        """
        return obj.tarjeta.usuario.username

    class Meta:
        model = CardMetadata
        fields = ["tarjeta", "nombre", "puesto", "descripcion", "username"]


class InboxSerializer(serializers.ModelSerializer):
    """
    Inbox serializer.
    """

    class Meta:
        model = Inbox
        fields = "__all__"
