from itertools import chain
from rest_framework import serializers
from core.models import (Course, Instructor, CourseContent, Video, LectureNote,
                         Homework, HomeworkSubmission, HomeworkSubReview, AcademicSession,
                         HomeworkSubComment, HomeworkSubNewComment, InstructorHoldWeek, UserCourse, Consultation,
                         CourseContentDocument, CourseContentResource)
from django.contrib.auth.models import User


class MiniCourseSerializer(serializers.ModelSerializer):
    coursetitle = serializers.SerializerMethodField()
    academicsession = serializers.SerializerMethodField()
    coursenumberclass = serializers.SerializerMethodField()
    courseimage = serializers.SerializerMethodField()

    class Meta:
        model = UserCourse
        fields = ['id', 'instructor_id', 'course_id', 'coursetitle', 'coursenumberclass', 'academicsession', 'courseimage' , 'approval_status', 'name']

    def get_coursetitle(self, obj):
        return obj.course.title

    def get_coursenumberclass(self, obj):
        return obj.course.number_class

    def get_courseimage(self, obj):
        if obj.course.image:
            return obj.course.image.url
        return None  

    def get_academicsession(self, obj):
        return obj.course.academic_session.title if obj.course.academic_session else None


class MiniCourseSerializerAdmin(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ['id', 'title', 'image']



class SuggestedCourseSerializer(serializers.ModelSerializer):
    academicsession = serializers.SerializerMethodField()


    class Meta:
        model = Course
        fields = ['id', 'title', 'number_class', 'country_fees', 'group_discount', 'academicsession', 'image']

    def get_academicsession(self, obj):
        return obj.academic_session.title if obj.academic_session else None

    # def get_holdweek(self, obj):
    #     holdweeks = HoldWeek.objects.filter(usercourse=obj)
    #     serializer = HoldWeekSerializer(holdweeks, many=True)

    #     return serializer.data

class CourseSerializer(serializers.ModelSerializer):
    instructor = serializers.SerializerMethodField()

    class Meta:
        model = Course
        # fields = ['id', 'title', 'details', 'duration', 'fee', 'image', 'rating', 'instructor', 'academic_session', 'student_count', 'is_active']
        # fields = ['id', 'title', 'details', 'duration', 'image', 'rating', 'instructor', 'academic_session', 'student_count', 'is_active', 'is_archived']
        # fields = ['id', 'title', 'details', 'duration', 'number_class', 'age_group' ,'student_limit', 'country_fees', 'course_cont_highlight', 'course_level', 'course_prerequisites', 
        # 'course_why_choose', 'image', 'rating', 'academic_session', 'course_week', 'student_count', 'is_active', 'is_archived', 'instructor', 'start_date', 'end_date',
        #  'group_discount', 'course_days', 'syllabus']
        # depth = 1

        fields = '__all__'

    def get_instructor(self, obj):
        instructor_list = []
        course_instructors = obj.instructor.all()

        for i in course_instructors:
            instructor_list.append({'instructor_id': i.id, 'name': f'{i.user.first_name} {i.user.last_name}'})

        return instructor_list


class CourseSerializerMini(serializers.ModelSerializer):
    class Meta:
        model = Course

        fields = ['id', 'title', 'details']


class UserCourseSerializerAdmin(serializers.ModelSerializer):
    primarystudent = serializers.SerializerMethodField()

    class Meta:
        model = UserCourse
        fields = ['id', 'primarystudent', 'instructor', 'name']
        depth = 1

    def get_primarystudent(self, obj):
        primarystudent = obj.user.all()[0]

        return {'primarystudent_fullname': f'{primarystudent.first_name} {primarystudent.last_name}', 'primarystudent_email': f'{primarystudent.email}'}


class CourseInstructorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        # fields = ['id', 'title', 'details', 'duration', 'fee', 'image', 'rating', 'instructor', 'academic_session', 'student_count', 'is_active']
        # fields = ['id', 'title', 'details', 'duration', 'image', 'rating', 'instructor', 'academic_session', 'student_count', 'is_active', 'is_archived']
        fields = ['id', 'instructor']
        depth = 1

class CourseContentSerializer(serializers.ModelSerializer):
    # homeworksubmission = serializers.SerializerMethodField()
    # homeworksubreview = serializers.SerializerMethodField()
    created_by = serializers.SerializerMethodField()
    elements = serializers.SerializerMethodField()

    class Meta:
        model = CourseContent
        fields = '__all__'

    def get_created_by(self, obj):
        if obj.created_by:
            return f'{obj.created_by.first_name} {obj.created_by.last_name}'
        else:
            return 'User deleted.'

    def get_elements(self, obj):
        video_data = CourseContentVideoSerializer(obj.video.all(), many=True)
        document_data = CourseContentDocumentSerializer(obj.document.all(), many=True)

        all_data = video_data.data + document_data.data

        all_data = sorted(all_data, key=lambda item: item['sequence'])

        return all_data

    # def get_homeworksubmission(self, obj):
    #     user = self.context.get('user', None)
    #     homeworksubmissions = HomeworkSubmission.objects.filter(coursecontent=obj, student=user)
    #     serializer = HomeworkSubmissionSerializer(homeworksubmissions, many=True, context={'user': user})

    #     return serializer.data

    # def get_homeworksubreview(self, obj):
    #     user_id = self.context.get('user_id', None)
    #     homeworksubreviews = HomeworkSubReview.objects.filter(coursecontent=obj, student_id=user_id)
    #     serializer = HomeworkSubReviewSerializer(homeworksubreviews, many=True)

    #     return serializer.data


class CourseContentMinSerializer(serializers.ModelSerializer):
    homework_submission_number = serializers.SerializerMethodField()

    class Meta:
        model = CourseContent
        fields = ['id', 'week', 'homework_submission_number']

    def get_homework_submission_number(self, obj):
        return obj.homework_submission.all().count()


class CourseContentVideoSerializer(serializers.ModelSerializer):
    created_by = serializers.SerializerMethodField()
    file_type = serializers.SerializerMethodField()
    resource = serializers.SerializerMethodField()

    class Meta:
        model = Video
        fields = ['id', 'sequence', 'course_content', 'title', 'file', 'created_at', 'edited_at', 'created_by', 'file_type', 'resource']

    def get_created_by(self, obj):
        if obj.created_by:
            return f'{obj.created_by.first_name} {obj.created_by.last_name}'
        else:
            return 'User deleted.'

    def get_file_type(self, obj):
        return 'video'

    def get_resource(self, obj):
        resource_list = CourseContentResourceSerializer(obj.resource.all().order_by('sequence'), many=True)
        # resource_list = [{'id': i.id, 'title': i.title, 'file': f'/media/{i.file}'} for i in resource_qs]
        return resource_list.data

class CourseContentDocumentSerializer(serializers.ModelSerializer):
    created_by = serializers.SerializerMethodField()
    file_type = serializers.SerializerMethodField()

    class Meta:
        model = CourseContentDocument
        fields = ['id', 'sequence', 'course_content', 'title', 'file', 'created_at', 'edited_at', 'created_by', 'file_type']

    def get_created_by(self, obj):
        if obj.created_by:
            return f'{obj.created_by.first_name} {obj.created_by.last_name}'
        else:
            return 'User deleted.'

    def get_file_type(self, obj):
        return 'document'


class CourseContentResourceSerializer(serializers.ModelSerializer):
    created_by = serializers.SerializerMethodField()
    
    class Meta:
        model = CourseContentResource
        fields = '__all__'
    
    def get_created_by(self, obj):
        if obj.created_by:
            return f'{obj.created_by.first_name} {obj.created_by.last_name}'
        else:
            return 'User deleted.'


class LectureNoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = LectureNote
        fields = ['id', 'title', 'file']


class HomeworkSerializer(serializers.ModelSerializer):
    class Meta:
        model = Homework
        fields = ['id', 'title', 'file']


class HomeworkSubmissionSerializer(serializers.ModelSerializer):
    submission_time = serializers.SerializerMethodField()
    is_comment_seen = serializers.SerializerMethodField()

    class Meta:
        model = HomeworkSubmission
        fields = ['id', 'title', 'file', 'submission_time', 'is_comment_seen']

    def get_submission_time(self, obj):
        return obj.time_created.strftime('%I:%M %p %m/%d/%y')

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

        try:
            newcomment = HomeworkSubNewComment.objects.get(homeworksubmission=obj, user=user)
            return newcomment.is_seen
        except:
            return True


class HomeworkSubCommentSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()
    time = serializers.DateTimeField(format="%I:%M %p %m/%d/%y")
    is_owner = serializers.SerializerMethodField()

    class Meta:
        model = HomeworkSubComment
        fields = ['id', 'name', 'text', 'time', 'is_owner']

    def get_name(self, obj):
        return f"{obj.comment_by.first_name} {obj.comment_by.last_name}"

    def get_is_owner(self, obj):
        user = self.context.get('user', None)
        return obj.comment_by == user


class HomeworkSubReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = HomeworkSubReview
        fields = ['id', 'title', 'file']


class StudentHomeworkSubmissionSerializer(serializers.ModelSerializer):
    homeworksubmission = serializers.SerializerMethodField()
    homeworksubreview = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ['id', 'first_name', 'last_name', 'homeworksubmission', 'homeworksubreview']

    def get_homeworksubmission(self, obj):
        coursecontent = self.context.get('coursecontent', None)
        user = self.context.get('user', None)
        homeworksubmissions = HomeworkSubmission.objects.filter(student=obj, coursecontent=coursecontent)
        serializer = HomeworkSubmissionSerializer(homeworksubmissions, many=True, context={'user': user})

        return serializer.data

    def get_homeworksubreview(self, obj):
        coursecontent = self.context.get('coursecontent', None)
        homeworksubreviews = HomeworkSubReview.objects.filter(student=obj, coursecontent=coursecontent)
        serializer = HomeworkSubReviewSerializer(homeworksubreviews, many=True)

        return serializer.data


class AcademicSessionSerializer(serializers.ModelSerializer):
    coursecount = serializers.SerializerMethodField()
    studentcount = serializers.SerializerMethodField()

    class Meta:
        model = AcademicSession
        fields = ['id', 'title', 'details', 'studentcount', 'coursecount']

    def get_coursecount(self, obj):
        return Course.objects.filter(academic_session=obj).distinct().count()

    def get_studentcount(self, obj):
        return User.objects.filter(course__academic_session=obj).distinct().count()


class AcademicSessionSerializerMini(serializers.ModelSerializer):
    class Meta:
        model = AcademicSession
        fields = ['id', 'title']
        
# book a session
class ConsultationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Consultation
        fields = '__all__'