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

from core.models import AnnouncementPost, AnnouncementUpvote, AnnouncementPostAttachment, Course


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 CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ['id', 'title', 'details', 'instructor', 'student']


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


class AnnouncementPostSerializer(serializers.ModelSerializer):
    course = CourseSerializer()
    user = UserSerializer()
    upvote_count = serializers.SerializerMethodField()
    upvote_flag = serializers.SerializerMethodField()
    view_count = serializers.SerializerMethodField()
    attachments = AnnouncementPostAttachmentSerializer(many=True)

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

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

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