from rest_framework import serializers

from apps.expediente.models import Disputa, ExpedienteLog


class ExpedienteLogSerializer(serializers.ModelSerializer):
    usuario_username = serializers.SerializerMethodField()

    class Meta:
        model = ExpedienteLog
        fields = ["id", "usuario_username", "accion", "detalle", "fecha"]

    def get_usuario_username(self, obj) -> str | None:
        u = getattr(obj, "usuario", None)
        if not u:
            return None
        username = getattr(u, "username", "")
        return username or str(u)


class DisputaSerializer(serializers.ModelSerializer):
    creada_por_username = serializers.SerializerMethodField(read_only=True)
    resuelta_por_username = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Disputa
        fields = [
            "id",
            "boleta",
            "creada_por",
            "creada_por_username",
            "motivo",
            "estado",
            "resolucion",
            "resuelta_por",
            "resuelta_por_username",
            "fecha_cierre",
            "created_at",
            "updated_at",
        ]
        read_only_fields = [
            "id",
            "boleta",
            "creada_por",
            "creada_por_username",
            "resuelta_por",
            "resuelta_por_username",
            "fecha_cierre",
            "created_at",
            "updated_at",
        ]

    def get_creada_por_username(self, obj) -> str | None:
        u = getattr(obj, "creada_por", None)
        if not u:
            return None
        username = getattr(u, "username", "")
        return username or str(u)

    def get_resuelta_por_username(self, obj) -> str | None:
        u = getattr(obj, "resuelta_por", None)
        if not u:
            return None
        username = getattr(u, "username", "")
        return username or str(u)


class DisputaCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Disputa
        fields = ["motivo", "estado"]


class DisputaUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Disputa
        fields = ["estado", "resolucion"]
