from rest_framework import serializers
from core.models import ExamType, Feedback, Student, Submission, Tutor
from util.factories import GradyUserFactory
import logging

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


class ExamSerializer(serializers.ModelSerializer):

    class Meta:
        model = ExamType
        fields = ('module_reference', 'total_score',
                  'pass_score', 'pass_only',)


class FeedbackSerializer(serializers.ModelSerializer):

    class Meta:
        model = Feedback
        fields = ('text', 'score')


class SubmissionSerializer(serializers.ModelSerializer):
    feedback = serializers.ReadOnlyField(source='feedback.text')
    score = serializers.ReadOnlyField(source='feedback.score')
    type = serializers.ReadOnlyField(source='type.name')
    full_score = serializers.ReadOnlyField(source='type.full_score')

    class Meta:
        model = Submission
        fields = ('type', 'text', 'feedback', 'score', 'full_score')


class StudentSerializer(serializers.ModelSerializer):
    name = serializers.ReadOnlyField(source='user.fullname')
    user = serializers.ReadOnlyField(source='user.username')
    exam = ExamSerializer()
    submissions = SubmissionSerializer(many=True)

    class Meta:
        model = Student
        fields = ('name', 'user', 'exam', 'submissions')


class TutorSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    feedback_count = serializers.IntegerField(source='get_feedback_count',
                                              read_only=True)

    def create(self, validated_data):
        log.info("Crating tutor from data %s", validated_data)
        return user_factory.make_tutor(
            username=validated_data['user']['username'])

    class Meta:
        model = Tutor
        fields = ('username', 'feedback_count')