"""
gamification/serializers.py
============================
Serializers del módulo de gamificación.
Todos son de lectura (ReadOnly) salvo los de gestión de canjes y beneficios.
"""

from rest_framework import serializers
from gamification.models import (
    Temporada, Puntos, Insignia, InsigniaAlumno,
    BeneficioFicha, Canje,
)
from shared.serializers.base import TimestampedSerializer, ReadOnlyModelSerializer


class TemporadaSerializer(TimestampedSerializer):
    class Meta:
        model  = Temporada
        fields = ['id', 'seccion', 'nombre', 'estado', 'inicio', 'cierre', 'created_at']
        read_only_fields = ['id', 'created_at']


class PuntosSerializer(ReadOnlyModelSerializer):
    """Puntos del alumno en una sección/temporada. Solo lectura."""
    nickname = serializers.CharField(source='alumno.nickname', read_only=True)

    class Meta:
        model  = Puntos
        fields = [
            'id', 'alumno', 'nickname', 'seccion', 'temporada',
            'total_puntos', 'total_fichas', 'racha_sesiones',
            'ultima_sesion_fecha',
        ]


class InsigniaSerializer(ReadOnlyModelSerializer):
    """Catálogo de insignias disponibles."""
    class Meta:
        model  = Insignia
        fields = [
            'id', 'codigo', 'categoria', 'emoji',
            'nombre', 'descripcion', 'criterio', 'nivel',
        ]


class InsigniaAlumnoSerializer(ReadOnlyModelSerializer):
    """Insignia desbloqueada por un alumno."""
    insignia = InsigniaSerializer(read_only=True)

    class Meta:
        model  = InsigniaAlumno
        fields = ['id', 'insignia', 'seccion', 'created_at']


class RankingItemSerializer(serializers.Serializer):
    """
    Un ítem del ranking para una sección/temporada.
    Generado dinámicamente por la vista, no mapeado a modelo.
    """
    pos          = serializers.IntegerField()
    alumno_id    = serializers.IntegerField()
    nickname     = serializers.CharField()
    total_puntos = serializers.IntegerField()
    total_fichas = serializers.IntegerField()
    racha_sesiones = serializers.IntegerField()
    insignias_count = serializers.IntegerField()


class BeneficioFichaSerializer(TimestampedSerializer):
    class Meta:
        model  = BeneficioFicha
        fields = [
            'id', 'seccion', 'nombre', 'descripcion',
            'costo_fichas', 'disponible', 'created_at',
        ]
        read_only_fields = ['id', 'created_at']


class CanjeSerializer(TimestampedSerializer):
    beneficio_nombre = serializers.CharField(source='beneficio.nombre', read_only=True)
    alumno_nickname  = serializers.CharField(source='alumno.nickname', read_only=True)

    class Meta:
        model  = Canje
        fields = [
            'id', 'alumno', 'alumno_nickname', 'beneficio', 'beneficio_nombre',
            'seccion', 'estado', 'fichas_usadas',
            'aprobado_por', 'aprobado_en', 'created_at',
        ]
        read_only_fields = ['id', 'estado', 'fichas_usadas', 'aprobado_por', 'aprobado_en', 'created_at']


class SolicitarCanjeSerializer(serializers.Serializer):
    """Alumno solicita canjear un beneficio."""
    beneficio_id = serializers.IntegerField()

    def validate_beneficio_id(self, value):
        try:
            beneficio = BeneficioFicha.objects.get(pk=value, disponible=True)
        except BeneficioFicha.DoesNotExist:
            raise serializers.ValidationError('Beneficio no disponible.')
        self.context['beneficio'] = beneficio
        return value
