import logging

import django.contrib.auth.password_validation as validators
from django.core import exceptions
from rest_framework import serializers

from core import models
from util.factories import GradyUserFactory

from .generic import DynamicFieldsModelSerializer

log = logging.getLogger(__name__)
user_factory = GradyUserFactory()


class TutorSerializer(DynamicFieldsModelSerializer):
    feedback_created = serializers.SerializerMethodField()
    feedback_validated = serializers.SerializerMethodField()
    password = serializers.CharField(
        style={'input_type': 'password'},
        write_only=True,
        required=False
    )

    def get_feedback_created(self, t):
        ''' It is required that this field was previously annotated '''
        return t.feedback_created if hasattr(t, 'feedback_created') else 0

    def get_feedback_validated(self, t):
        ''' It is required that this field was previously annotated '''
        return t.feedback_validated if hasattr(t, 'feedback_validated') else 0

    def create(self, validated_data) -> models.UserAccount:
        log.info("Crating tutor from data %s", validated_data)
        return user_factory.make_tutor(
            username=validated_data['username'],
            password=validated_data.get('password'),
            is_active=validated_data.get('is_active', False))

    def validate(self, data):
        user = models.UserAccount(**data)
        password = data.get('password')

        try:
            if password is not None:
                validators.validate_password(password=password, user=user)
        except exceptions.ValidationError as err:
            raise serializers.ValidationError({'password': list(err.messages)})
        return data

    class Meta:
        model = models.UserAccount
        fields = ('pk',
                  'password',
                  'is_active',
                  'username',
                  'feedback_created',
                  'feedback_validated')