from rest_framework import serializers
from core.models import UserCourse, HoldWeek, ExamFeedback, CourseActivity, CourseMember
from django.contrib.auth.models import User


class UserCourseSerializer(serializers.ModelSerializer):
    coursetitle = serializers.SerializerMethodField()
    academicsession = serializers.SerializerMethodField()
    holdweek = serializers.SerializerMethodField()

    class Meta:
        model = UserCourse
        fields = ['id', 'coursetitle', 'academicsession', 'holdweek', 'hold_access']

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

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

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

        return serializer.data


class HoldWeekSerializer(serializers.ModelSerializer):
    class Meta:
        model = HoldWeek
        fields = ['id', 'week']


class InstructorExamFeedbackSerializer(serializers.ModelSerializer):
    examfeedbacks = serializers.SerializerMethodField()

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

    def get_examfeedbacks(self, obj):
        course_id = self.context.get('course_id', None)
        examfeedbacks = ExamFeedback.objects.filter(student=obj, course_id=course_id)
        serializer = ExamFeedbackSerializer(examfeedbacks, many=True)

        return serializer.data


class ExamFeedbackSerializer(serializers.ModelSerializer):
    submission_time = serializers.SerializerMethodField()

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

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


class CourseActivitySerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseActivity
        fields = ['id',]


class CourseInvitationSerializer(serializers.ModelSerializer):
    coursetitle = serializers.SerializerMethodField()
    instructorname = serializers.SerializerMethodField()
    name = serializers.SerializerMethodField()
    image = serializers.SerializerMethodField()

    class Meta:
        model = CourseMember
        fields = [
            'id', 'user', 'name', 'image', 'invite_to', 'is_accept', 
            'course', 'coursetitle', 'usercourse', 'instructorname'
        ]

    def get_coursetitle(self, obj):
        # Handle the case where `course` may be `None`
        return obj.course.title if obj.course else "No Title"

    def get_name(self, obj):
        # Handle cases where `invite_to` does not match a user
        try:
            user = User.objects.get(email=obj.invite_to)
            return f'{user.first_name} {user.last_name}'
        except User.DoesNotExist:
            return "Unknown User"

    def get_image(self, obj):
        try:
            # Safely fetch user by email
            user = User.objects.get(email=obj.invite_to)
            # Return image URL if it exists
            return user.userinformation.image.url if hasattr(user.userinformation, 'image') and user.userinformation.image else None
        except User.DoesNotExist:
            return None

    def get_instructorname(self, obj):
        # Check for a related usercourse and instructor
        user_course = obj.usercourse
        if user_course and user_course.instructor:
            return user_course.instructor.name
        return "No Instructor"
