from rest_framework import serializers
from django.contrib.auth.models import User

from core.models import (DiscussionPost, DiscussionReply, DiscussionUpvote, DiscussionPostAttachment,
                            DiscussionReplyAttachment, Course, UserInformation)


class UserSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ['id', 'full_name', 'username', 'first_name', 'last_name', 'email']

    def get_full_name(self, obj):
        return obj.first_name+' '+obj.last_name

class UserShortSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()
    userPic = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ['id', 'full_name', 'userPic']

    def get_full_name(self, obj):
        return obj.first_name+' '+obj.last_name

    def get_userPic(self, obj):
        return obj.userinformation.image.url if obj.userinformation.image else None


class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ['id', 'title', 'details', 'instructor', 'student']


class DiscussionPostAttachmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = DiscussionPostAttachment
        fields = ['id', 'attachment']


class DiscussionPostSerializer(serializers.ModelSerializer):
    # course = CourseSerializer()
    user = UserShortSerializer()
    upvote_count = serializers.SerializerMethodField()
    upvote_flag = serializers.SerializerMethodField()
    view_count = serializers.SerializerMethodField()
    reply_count = serializers.SerializerMethodField()
    attachments = DiscussionPostAttachmentSerializer(many=True)

    class Meta:
        model = DiscussionPost
        fields = ['id', 'usercourse', 'user', 'title', 'content', 'created_at', 'edited_at', 
                    'is_edited', 'is_published', 'view_count', 'attachments', 'upvote_count', 'reply_count', 'upvote_flag']

    def get_upvote_count(self, obj):
        return obj.discussion_upvotes.all().count()

    def get_upvote_flag(self, obj):
        request_user = self.context.get('request_user', '')
        if request_user != '':
            return obj.discussion_upvotes.all().filter(user=request_user).exists()
        else:
            return False
    
    def get_view_count(self, obj):
        return obj.views.all().count()

    def get_reply_count(self, obj):
        return DiscussionReply.objects.filter(discussion_post=obj).count()


class DiscussionReplyAttachmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = DiscussionReplyAttachment
        fields = ['id', 'attachment']


class DiscussionReplySerializer(serializers.ModelSerializer):
    user = UserShortSerializer()
    upvote_count = serializers.SerializerMethodField()
    upvote_flag = serializers.SerializerMethodField()
    child_replies = serializers.SerializerMethodField()
    attachments = DiscussionReplyAttachmentSerializer(many=True)

    class Meta:
        model = DiscussionReply
        fields = ['id', 'content', 'created_at', 'edited_at', 'discussion_post', 'user', 'attachments',
                    'is_edited', 'is_deleted', 'upvote_count', 'upvote_flag', 'parent_reply', 'child_replies']

    def get_upvote_count(self, obj):
        return obj.discussion_upvotes.all().count()

    def get_upvote_flag(self, obj):
        request_user = self.context.get('request_user', '')
        if request_user != '':
            return obj.discussion_upvotes.all().filter(user=request_user).exists()
        else:
            return False

    def get_child_replies(self, obj):
        request_user = self.context.get('request_user', '')
        child_replies_queryset = obj.child_replies.all().order_by('created_at')
        serializer = DiscussionReplySerializer(child_replies_queryset, many=True, context={'request_user': request_user})
        return serializer.data