from django.contrib.auth.models import User
from rest_framework import serializers
from .models import ContentItem, Question


class UserSerializer(serializers.ModelSerializer):
    role = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ('id', 'email', 'role')

    def get_role(self, obj):
        return 'ADMIN' if obj.is_staff else 'STUDENT'


class QuestionSerializer(serializers.ModelSerializer):
    questionText = serializers.CharField(source='question_text')
    answerText = serializers.CharField(source='answer_text')

    class Meta:
        model = Question
        fields = ('id', 'questionText', 'answerText', 'price', 'is_published', 'is_locked', 'difficulty', 'points')


class ContentItemSerializer(serializers.ModelSerializer):
    coverImage = serializers.CharField(source='cover_image', allow_null=True)
    questions = QuestionSerializer(many=True, read_only=True)

    class Meta:
        model = ContentItem
        fields = ('id', 'title', 'description', 'coverImage', 'price', 'category', 'instructor', 'level', 'questions')

    def to_representation(self, instance):
        data = super().to_representation(instance)
        request = self.context.get('request')
        user = getattr(request, 'user', None)
        unlocked = bool(user and user.is_authenticated and (user.is_staff or instance.student_access.filter(user=user).exists()))
        for question in data['questions']:
            model_question = instance.questions.get(id=question['id'])
            free = model_question.price <= 0 and not model_question.is_locked
            question['isLocked'] = not (unlocked or free)
            if question['isLocked']:
                question.pop('answerText', None)
        return data
