from rest_framework import serializers

from .models import (
    Facultad, Carrera, Gestion, Asignatura, Persona,
    Grupo, EncuestaPlantilla, Pregunta, Token, Respuesta,
)


class FacultadSerializer(serializers.ModelSerializer):
    total_carreras = serializers.SerializerMethodField()

    class Meta:
        model = Facultad
        fields = ["id", "nombre", "escudo", "total_carreras"]

    def get_total_carreras(self, obj):
        return obj.carreras.count()


class CarreraSerializer(serializers.ModelSerializer):
    facultad_nombre = serializers.CharField(source="facultad.nombre", read_only=True)
    total_asignaturas = serializers.SerializerMethodField()

    class Meta:
        model = Carrera
        fields = ["id", "nombre", "facultad", "facultad_nombre", "escudo", "total_asignaturas"]

    def get_total_asignaturas(self, obj):
        return obj.asignaturas.count()


class GestionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Gestion
        fields = ["id", "nombre", "fecha_inicio", "fecha_fin", "activa"]


class AsignaturaSerializer(serializers.ModelSerializer):
    carrera_nombre = serializers.CharField(source="carrera.nombre", read_only=True)

    class Meta:
        model = Asignatura
        fields = ["id", "nombre", "carrera", "carrera_nombre"]


class PersonaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Persona
        fields = ["id", "nombre", "email", "rol"]


class GrupoSerializer(serializers.ModelSerializer):
    asignatura_nombre = serializers.CharField(source="asignatura.nombre", read_only=True)
    carrera_id = serializers.IntegerField(source="asignatura.carrera.id", read_only=True)
    gestion_nombre = serializers.CharField(source="gestion.nombre", read_only=True)
    docente_nombre = serializers.CharField(source="docente.nombre", read_only=True)
    director_nombre = serializers.CharField(source="director.nombre", read_only=True)
    total_qr_generados = serializers.SerializerMethodField()
    total_qr_usados = serializers.SerializerMethodField()

    class Meta:
        model = Grupo
        fields = [
            "id", "asignatura", "asignatura_nombre", "carrera_id", "gestion", "gestion_nombre",
            "codigo", "docente", "docente_nombre", "director", "director_nombre",
            "cantidad_estudiantes", "total_qr_generados", "total_qr_usados",
        ]

    def get_total_qr_generados(self, obj):
        return obj.tokens.count()

    def get_total_qr_usados(self, obj):
        return obj.tokens.filter(estado=Token.ESTADO_USADO).count()

    def validate_cantidad_estudiantes(self, valor):
        if valor < 1:
            raise serializers.ValidationError("La cantidad de estudiantes debe ser al menos 1.")
        if valor > 500:
            raise serializers.ValidationError("Cantidad de estudiantes fuera de rango esperado.")
        return valor


class PreguntaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Pregunta
        fields = ["id", "orden", "texto", "escala", "requerida"]


class EncuestaPlantillaSerializer(serializers.ModelSerializer):
    preguntas = PreguntaSerializer(many=True, read_only=True)

    class Meta:
        model = EncuestaPlantilla
        fields = ["id", "tipo", "version", "titulo", "activa", "preguntas"]


class TokenSerializer(serializers.ModelSerializer):
    class Meta:
        model = Token
        fields = ["id", "token", "tipo", "grupo", "plantilla", "etiqueta", "estado", "creado_en", "usado_en"]
        read_only_fields = fields


class RespuestaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Respuesta
        fields = ["id", "token", "plantilla", "respuestas", "enviado_en"]
        read_only_fields = ["id", "enviado_en"]
