from django.db import transaction
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers
from .models import Usuario

class CadastroSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    class Meta:
        model = Usuario
        fields = ['first_name', 'last_name', 'email', 'is_escritor', 'is_leitor_especial', 'password']

    def create(self, validated_data):
        with transaction.atomic():
            user = Usuario.objects.create_user(
                **validated_data
            )

        return user

class EditarPerfilSerializer(serializers.ModelSerializer):
    class Meta:
        model = Usuario
        fields = ['first_name', 'last_name', 'email', 'avatar', 'bio']

class TrocarSenhaSerializer(serializers.Serializer):
    old_password = serializers.CharField(write_only=True, trim_whitespace=False)
    new_password = serializers.CharField(write_only=True, trim_whitespace=False)

    def validate_old_password(self, value):
        user = self.context['request'].user
        if not user.check_password(value):
            raise serializers.ValidationError('Senha antiga incorreta.')
        return value

    def validate_new_password(self, value):
        user = self.context['request'].user
        validate_password(value, user=user)
        return value

    def validate(self, attrs):
        if attrs.get('old_password') == attrs.get('new_password'):
            raise serializers.ValidationError({'new_password': 'A nova senha não pode ser igual à senha antiga.'})
        return attrs

    def update(self, instance, validated_data):
        instance.set_password(validated_data['new_password'])
        instance.save()
        return instance


