from rest_framework import serializers
from core.models import (
    CourseModule, ModuleContent, ElementContent, VideoContent, AttachmentContent,
    ContentNote, ModuleContentView
)

class ModuleContentSerializer(serializers.ModelSerializer):
    title = serializers.SerializerMethodField()
    content_id = serializers.SerializerMethodField()
    file = serializers.SerializerMethodField()
    is_viewed = serializers.SerializerMethodField()  # For student view only

    class Meta:
        model = ModuleContent
        fields = ['id', 'content_id', 'type', 'title', 'file', 'is_active', 'is_viewed']

    def get_title(self, obj):
        if obj.type == 'Element':
            return obj.element_content.title
        elif obj.type == 'Video':
            return obj.video_content.title
        elif obj.type == 'Attachment':
            return obj.attachment_content.title
        else:
            return ''

    def get_content_id(self, obj):
        if obj.type == 'Element':
            return obj.element_content.id
        elif obj.type == 'Video':
            return obj.video_content.id
        elif obj.type == 'Attachment':
            return obj.attachment_content.id
        else:
            return None

    def get_file(self, obj):
        if obj.type == 'Video':
            return obj.video_content.file.url if obj.video_content.file else None
        elif obj.type == 'Attachment':
            return obj.attachment_content.file.url if obj.attachment_content.file else None
        else:
            return None

    def get_is_viewed(self, obj):
        user = self.context.get('user', None)

        if ModuleContentView.objects.filter(module_content=obj, user=user).exists():
            return True
        else:
            return False


class CourseModuleSerializer(serializers.ModelSerializer):
    module_contents = serializers.SerializerMethodField()
    is_viewed = serializers.SerializerMethodField()  # For student view only

    class Meta:
        model = CourseModule
        fields = ['id', 'title', 'is_active', 'module_contents', 'is_viewed']

    def get_module_contents(self, obj):
        user = self.context.get('user', None)

        if user.userinformation.role == 'Student':
            module_contents = obj.module_contents.filter(is_active=True)
            return ModuleContentSerializer(module_contents, many=True, context={'user': user}).data
        else:
            return ModuleContentSerializer(obj.module_contents.all(), many=True).data

    def get_is_viewed(self, obj):  # For student view only
        user = self.context.get('user', None)

        module_contents = obj.module_contents.filter(is_active=True)
        for module_content in module_contents:
            if not ModuleContentView.objects.filter(module_content=module_content, user=user).exists():
                return False

        return True


class ElementContentSerializer(serializers.ModelSerializer):
    course_module_id = serializers.SerializerMethodField()
    module_content_id = serializers.SerializerMethodField()
    type = serializers.SerializerMethodField()

    class Meta:
        model = ElementContent
        fields = ['id', 'course_module_id', 'module_content_id', 'type', 'title',
                  'content', 'time_created', 'time_edited']

    def get_course_module_id(self, obj):
        return obj.module_content.course_module.id

    def get_module_content_id(self, obj):
        return obj.module_content.id

    def get_type(self, obj):
        return obj.module_content.type

    def get_course_module_id(self, obj):
        return obj.module_content.course_module.id


class VideoContentSerializer(serializers.ModelSerializer):
    course_module_id = serializers.SerializerMethodField()
    module_content_id = serializers.SerializerMethodField()
    type = serializers.SerializerMethodField()

    class Meta:
        model = VideoContent
        fields = ['id', 'course_module_id', 'module_content_id', 'type', 'title',
                  'file', 'time_created', 'time_edited']

    def get_course_module_id(self, obj):
        return obj.module_content.course_module.id

    def get_module_content_id(self, obj):
        return obj.module_content.id

    def get_type(self, obj):
        return obj.module_content.type


class AttachmentContentSerializer(serializers.ModelSerializer):
    course_module_id = serializers.SerializerMethodField()
    module_content_id = serializers.SerializerMethodField()
    type = serializers.SerializerMethodField()

    class Meta:
        model = AttachmentContent
        fields = ['id', 'course_module_id', 'module_content_id', 'type', 'title',
                  'file', 'time_created', 'time_edited']

    def get_course_module_id(self, obj):
        return obj.module_content.course_module.id

    def get_module_content_id(self, obj):
        return obj.module_content.id

    def get_type(self, obj):

        return obj.module_content.type


class ContentNoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContentNote
        fields = ['id', 'text', 'time_created', 'time_edited']
