from rest_framework import serializers
from course.serializers import CourseListSerializer
from mindmap.serializers import MindmapListSerializer
from user.models import User
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class UserAuthentificationSerializer(TokenObtainPairSerializer):
    username_field = 'email'

class UserSerializer(serializers.ModelSerializer):
    courses = serializers.SerializerMethodField()
    mindmaps = serializers.SerializerMethodField()
    packs = serializers.ListField(
        child=serializers.JSONField(),
        required=False,
        default=list
    )
    class Meta:
        model = User
        fields = ['email', 'username', 'firstName', 'lastName', 'defaultAcademicLevel', 'subscription_id', 'publicIdentifier', 'courses', 'mindmaps', 'tokens_used', 'tokens_limit', 'tokens_reset_date', 'abonnement_type', 'abonnement_end_date', 'is_abonnement_active', 'stripe_id', 'packs']
        extra_kwargs = {'email': {'read_only': True}, 'publicIdentifier': {'read_only': True}, 'stripe_id': {'read_only': True}, 'abonnement_type': {'read_only': True}}
    def get_courses(self, instance):
        queryset = instance.courses
        serializer = CourseListSerializer(queryset, many=True)
        return serializer.data
    def get_mindmaps(self, instance):
        queryset = instance.mindmaps
        serializer = MindmapListSerializer(queryset, many=True)
        return serializer.data


class UserSpecialSerializer(serializers.ModelSerializer):
    username = serializers.CharField(required=False)
    firstName = serializers.CharField(required=False)
    lastName = serializers.CharField(required=False)
    defaultAcademicLevel = serializers.CharField(required=False)
    school = serializers.CharField(required=False)
    activated_packs = serializers.ListField(
        child=serializers.JSONField(),
        required=False,
        default=list
    )
    
    class Meta:
        model = User
        fields = ['email', 'username', 'firstName', 'lastName', 'defaultAcademicLevel', 'school', 'publicIdentifier', 'password', 'activated_packs']
        extra_kwargs = {
            'password': {'write_only': True, 'required': False}
        }
        
    def create(self, validated_data):
        return User.objects.create_user(**validated_data)

class GenericUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email', 'publicIdentifier']
        extra_kwargs = {'email': {'read_only': True}, 'publicIdentifier': {'read_only': True}}

