from rest_framework import serializers
from .models import Usuario
from Models.Usuario import Usuario


# 🔑 Para login (solo email y password)
class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField(write_only=True)


# 👤 Para crear usuarios (todos los campos)
# 👤 Para crear usuarios (todos los campos)
class UsuarioSerializer(serializers.ModelSerializer):
    nombre_rol = serializers.SerializerMethodField()
    rol_usuario_id = serializers.IntegerField(source='rol_usuario.id', read_only=True)
    
    def get_nombre_rol(self, obj):
        return obj.rol_usuario.nombre_rol if obj.rol_usuario else None

    # rol_usuario_id input for writing is handled by default model serializer behavior or we can add a specific write-only field if needed, 
    # but since we want to READ it, let's map it.
    # To support writing we can add a separate field or just rely on the foreign key if it was in fields. 
    # The ModelSerializer with 'rol_usuario_id' in fields usually expects the FK.
    # Let's verify how it was. It was: rol_usuario_id = serializers.IntegerField(required=False, write_only=True)
    # We want it readable too.
    
    # Let's use a method or source for reading, and keep the existing structure if possible, but the ModelSerializer can handle 'rol_usuario' FK.
    # If we look at the model, the FK is 'rol_usuario'.
    
    # Let's just make it both read and write compatible or add a read field.
    # The previous code had `rol_usuario_id = serializers.IntegerField(required=False, write_only=True)`.
    # I will change it to be a standard field that maps to the model field, or just remove the override if `rol_usuario_id` isn't the direct field name.
    # The model `Usuario` likely has `rol_usuario` FK. 
    
    # Strategy: Add a read-only field for the ID to ensure it's in the output. The write handling can stay or be adjusted.
    # Actually, simpler: just remove `write_only=True` and let it be a normal integer field if that maps to a property, OR source it.
    
    rol_usuario_id = serializers.IntegerField(source='rol_usuario.id', read_only=True) 
    
    # We need to accept it for writing too. The view logic currently handles assigning it? 
    # View `create_usuario` says: `data['rol_usuario_id'] = rol.id` ... `serializer = self.get_serializer_class()(data=data)`.
    # And `UsuarioSerializer` implies it accepts `rol_usuario_id`.
    
    # Let's separate read and write to be safe.
    rol_id = serializers.IntegerField(source='rol_usuario.id', read_only=True)

    class Meta:
        model = Usuario
        fields = ['id', 'nombre', 'email', 'estado_usuario_id', 'rol_usuario_id', 'rol_id', 'nombre_rol', 'fecha_creacion', 'password']
        extra_kwargs = {
            'password': {'write_only': True},
            'rol_usuario_id': {'write_only': True} 
        }

class TokenVerifySerializer(serializers.Serializer):
    token = serializers.CharField()

    class Meta:
        ref_name = "TokenVerifySerializer"

class UsuarioUpdateSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
    rol_usuario_id = serializers.IntegerField(required=False, allow_null=True)
    estado_usuario_id = serializers.IntegerField(required=False)

    class Meta:
        model = Usuario
        fields = ['id', 'nombre', 'email', 'estado_usuario_id', 'rol_usuario_id', 'password']
        extra_kwargs = {
            'password': {'write_only': True, 'required': False}
        }

class UsuarioDeleteSerializer(serializers.Serializer):
    id = serializers.IntegerField()