from rest_framework import serializers
from core.models import Course, Instructor, InstructorTime, InstructorHoldWeek, InstructorDocuments, Testimonial, UserCourse, InstructorEducation, InstructorTime


class InstructorDetailsSerializer(serializers.ModelSerializer):
    documents = serializers.SerializerMethodField()
    educations = serializers.SerializerMethodField()
    timeslot = serializers.SerializerMethodField()
    profile_completion = serializers.SerializerMethodField()
    image =  serializers.SerializerMethodField()
    profile_status = serializers.SerializerMethodField()
    

    class Meta:
        model = Instructor
        fields = [
            'id', 'user', 'name', 'occupation', 'details', 'contact_email', 
            'status', 'is_one_to_one', 'is_one_to_group', 'is_one_to_many',
            'is_selfpaced', 'hourly_fee', 'city', 'language', 'wp_number',
            'skype_id', 'website', 'linked_in_id', 'profile_completion', 'documents', 'educations', 'timeslot', 'image', 'profile_status'
        ]
    def get_profile_status(self, obj):
        user = obj.user
        return user.userinformation.profile_lock
        
    def get_profile_completion(self, obj):
        # Call the method to get the profile completion percentage
        return obj.calculate_instructor_profile_completion()
    
    def get_documents(self, obj):
        documents = InstructorDocuments.objects.filter(instructor=obj.id)
        serializer = InstructorDocumentsSerializer(documents, many=True)

        return serializer.data

    def get_educations(self, obj):
        educations = InstructorEducation.objects.filter(instructor=obj.id)
        serializer = InstructorEducationSerializer(educations, many=True)

        return serializer.data
    def get_timeslot(self, obj):
        educations = InstructorTime.objects.filter(instructor=obj.id)
        serializer = InstructorTimeSerializer(educations, many=True)

        return serializer.data
    def get_image(self, obj):
        # Use 'obj' instead of 'user'
        user = obj.user
        if hasattr(user, 'userinformation') and user.userinformation.image:
            return user.userinformation.image.url
        return None


class InstructorShortListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Instructor
        fields = ['id', 'name']
        

class InstructorShortUnauthListSerializer(serializers.ModelSerializer):
    image =  serializers.SerializerMethodField()
    name = serializers.SerializerMethodField()
    course = serializers.SerializerMethodField()
    class Meta:
        model = Instructor
        fields = ['id', 'name', 'image', 'course']
    
    def get_image(self, obj):
        # Use 'obj' instead of 'user'
        user = obj.user
        if hasattr(user, 'userinformation') and user.userinformation.image:
            return user.userinformation.image.url
        return None

    def get_name(self, obj):
        user = obj.user
        return user.first_name+' '+user.last_name

    def get_course(self, obj):
        first_course = obj.course.first()  # Fetch the first course
        return first_course.title if first_course else None



class InstructorDetailsUnauthListSerializer(serializers.ModelSerializer):
    image =  serializers.SerializerMethodField()
    name = serializers.SerializerMethodField()
    course = serializers.SerializerMethodField()
    course_count = serializers.SerializerMethodField()
    rating = serializers.SerializerMethodField()
    student_count = serializers.SerializerMethodField()
    education = serializers.SerializerMethodField()
    class Meta:
        model = Instructor
        fields = ['id', 'details', 'language' , 'name', 'image', 'course', 'student_count', 'course_count', 'rating', 'education']
    
    def get_image(self, obj):
        # Use 'obj' instead of 'user'
        user = obj.user
        if hasattr(user, 'userinformation') and user.userinformation.image:
            return user.userinformation.image.url
        return None

    def get_name(self, obj):
        user = obj.user
        return user.first_name+' '+user.last_name

    def get_course(self, obj):
        courses = obj.course.all()  # Fetch all courses associated with the instructor
        if courses.exists():
            return [
                {
                    "title": course.title,
                    "details": course.details,
                    "image": course.image.url if course.image else None,
                    "ageGroup": course.age_group,
                    "price": course.country_fees,
                }
                for course in courses
            ]
        return None

    def get_course_count(self, obj):
        return obj.course.count() 

    def get_student_count(self, obj):
        return obj.user_course.values_list('user', flat=True).distinct().count() 

    def get_rating(self, obj):
    # Fetch all testimonials related to this instructor
        ratings = obj.course_instructor.all()
        
        if ratings.exists():
            return [
                {
                    "user_name": f"{rating.user.first_name} {rating.user.last_name}" if rating.user else None,
                    "image": rating.user.userinformation.image.url if rating.user and rating.user.userinformation and rating.user.userinformation.image else None,
                    "rating": rating.rating,
                    "comments": rating.testimonial,
                }
                for rating in ratings
            ]
        return None
    def get_education(self, obj):
        education_records = obj.instructor_educations.filter(is_publish=True)

        if education_records.exists():
            return [
                {
                    "id": edu.id,
                    "degree": edu.degree,
                    "university_name": edu.university_name,
                    "university_city": edu.university_city,
                    "university_country": edu.university_country,
                    "session_start": edu.session_start.strftime("%Y-%m-%d") if edu.session_start else None,
                    "session_end": edu.session_end.strftime("%Y-%m-%d") if edu.session_end else None,
                    "degree_details": edu.degree_details,
                    "is_publish": edu.is_publish,
                }
                for edu in education_records
            ]
        
        return None  # No education records found






class InstructorTimeSerializer(serializers.ModelSerializer):
    instructor_name = serializers.SerializerMethodField()
    time = serializers.TimeField(format='%I:%M %p', input_formats=['%H:%M','%H:%M:%S'])

    class Meta:
        model = InstructorTime
        fields = ['id', 'time', 'day', 'booked_status', 'instructor', 'instructor_name']

    def get_instructor_name(self, obj):
        return obj.instructor.name


class InstructorHoldWeekSerializer(serializers.ModelSerializer):
    class Meta:
        model = InstructorHoldWeek
        fields = ['id', 'instructor', 'course', 'week']
        depth = 1


class InstructorDocumentsSerializer(serializers.ModelSerializer):
    class Meta:
        model = InstructorDocuments
        fields = '__all__'

class InstructorDocumentsPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = InstructorDocuments
        fields = ['id', 'title', 'instructor', 'source_type', 'file']

class InstructorEducationSerializer(serializers.ModelSerializer):
    education_completion = serializers.SerializerMethodField()
    degree = serializers.CharField(required=True, max_length=500, allow_blank=False, allow_null=False)
    university_name = serializers.CharField(required=True, max_length=500, allow_blank=False, allow_null=False)
    university_city = serializers.CharField(required=True, max_length=150, allow_blank=False, allow_null=False)
    university_country = serializers.CharField(required=True, max_length=200, allow_blank=False, allow_null=False)
    session_start = serializers.DateField()
    session_end = serializers.DateField()
    degree_details = serializers.CharField(required=True, max_length=500, allow_blank=False, allow_null=False)

    class Meta:
        model = InstructorEducation
        fields = [
            'id', 'degree', 'university_name', 'university_city', 
            'university_country', 'session_start', 'session_end', 
            'degree_details', 'is_publish', 'instructor', 'education_completion'
        ]

    def get_education_completion(self, obj):
        return self.context.get('education_completion', None)
    
    def validate(self, data):
        # Validate session dates
        if data.get('session_start') and data.get('session_end') and data['session_start'] > data['session_end']:
            raise serializers.ValidationError("Session end date must be after the start date.")
        return data