"""
users/serializers/users.py
===========================
Serializers para consulta y gestión de usuarios.
Separados de auth.py para mantener claridad de responsabilidades:
  - auth.py → crear, autenticar
  - users.py → leer, listar, actualizar perfiles
"""

from rest_framework import serializers
from users.models import CustomUser, PerfilDocente, PerfilAlumno
from shared.serializers.base import TimestampedSerializer


class UserProfileSerializer(TimestampedSerializer):
    """
    Perfil completo del usuario autenticado.
    Incluye datos descifrados del perfil según el rol.
    """

    email       = serializers.SerializerMethodField()
    nombre      = serializers.SerializerMethodField()
    perfil      = serializers.SerializerMethodField()

    class Meta:
        model = CustomUser
        fields = [
            'id', 'email', 'nombre', 'role', 'nickname',
            'is_active', 'is_approved', 'perfil',
            'created_at',
        ]
        read_only_fields = ['id', 'role', 'is_approved', 'created_at']

    def get_email(self, obj) -> str:
        """Descifra el email solo para el perfil propio."""
        return obj.email

    def get_nombre(self, obj) -> str:
        """Retorna el nombre completo según el rol."""
        if obj.role == 'docente' and hasattr(obj, 'perfil_docente'):
            return obj.perfil_docente.nombre_completo
        if obj.role == 'alumno' and hasattr(obj, 'perfil_alumno'):
            return obj.perfil_alumno.nombre_completo
        return ''

    def get_perfil(self, obj) -> dict:
        """Datos extra según el rol."""
        if obj.role == 'docente' and hasattr(obj, 'perfil_docente'):
            p = obj.perfil_docente
            return {
                'institucion':  p.institucion,
                'departamento': p.departamento,
                'cargo':        p.cargo,
                'aprobado_en':  p.aprobado_en,
            }
        if obj.role == 'alumno' and hasattr(obj, 'perfil_alumno'):
            p = obj.perfil_alumno
            return {
                'invitado_por': p.invitado_por_id,
            }
        return {}


class DocenteListSerializer(TimestampedSerializer):
    """
    Serializer para listar docentes (vista de admin).
    Incluye nombre descifrado del perfil.
    """

    nombre      = serializers.SerializerMethodField()
    email       = serializers.SerializerMethodField()
    institucion = serializers.SerializerMethodField()
    departamento= serializers.SerializerMethodField()

    class Meta:
        model = CustomUser
        fields = [
            'id', 'nombre', 'email', 'role',
            'is_active', 'is_approved',
            'institucion', 'departamento',
            'created_at',
        ]

    def get_nombre(self, obj) -> str:
        return getattr(getattr(obj, 'perfil_docente', None), 'nombre_completo', '')

    def get_email(self, obj) -> str:
        return obj.email

    def get_institucion(self, obj) -> str:
        return getattr(getattr(obj, 'perfil_docente', None), 'institucion', '')

    def get_departamento(self, obj) -> str:
        return getattr(getattr(obj, 'perfil_docente', None), 'departamento', '')


class AlumnoListSerializer(TimestampedSerializer):
    """
    Serializer para listar alumnos (vista de admin y docente).
    """

    nombre          = serializers.SerializerMethodField()
    email           = serializers.SerializerMethodField()
    invitado_por_id = serializers.SerializerMethodField()

    class Meta:
        model = CustomUser
        fields = [
            'id', 'nombre', 'email', 'nickname',
            'is_active', 'invitado_por_id', 'created_at',
        ]

    def get_nombre(self, obj) -> str:
        return getattr(getattr(obj, 'perfil_alumno', None), 'nombre_completo', '')

    def get_email(self, obj) -> str:
        return obj.email

    def get_invitado_por_id(self, obj) -> int:
        return getattr(getattr(obj, 'perfil_alumno', None), 'invitado_por_id', None)
