from rest_framework import serializers
from .models import Course
from teacher_management.serializers import TeacherListSerializer
from routine.models import RoutineData

class CourseSerializer(serializers.ModelSerializer):
    teachers = serializers.SerializerMethodField()
    status = serializers.SerializerMethodField()
    course_name = serializers.CharField(source='name', required=False)
    course_code = serializers.CharField(source='code', required=False)
    credits = serializers.DecimalField(source='credit', max_digits=3, decimal_places=1, required=False)

    class Meta:
        model = Course
        fields = ('id', 'name', 'code', 'slug', 'credit', 'credit_hours', 'teachers', 'status', 'course_name', 'course_code', 'credits', 'department', 'year', 'semester', 'created_at', 'updated_at')
        read_only_fields = ('slug',)

    def to_internal_value(self, data):
        # Map frontend names to backend names if present
        if 'course_name' in data and 'name' not in data:
            data['name'] = data.get('course_name')
        if 'course_code' in data and 'code' not in data:
            data['code'] = data.get('course_code')
        if 'credits' in data and 'credit' not in data:
            data['credit'] = data.get('credits')
        return super().to_internal_value(data)

    def get_teachers(self, obj):
        teacher_serializer = TeacherListSerializer(
            obj.teachers.all(), 
            many=True, 
            context=self.context
        )
        return teacher_serializer.data

    def get_status(self, obj):
        timeslot_id = self.context.get('timeslot')
        if not timeslot_id:
            return "Not Applicable"
        busy_teacher_ids = self.context.get('busy_teacher_ids', set())

        course_teachers = obj.teachers.all()

        if not course_teachers.exists():
            return "Available"

        for teacher in course_teachers:
            # If we find at least one available teacher, the course is available.
            if teacher.teacher_id not in busy_teacher_ids:
                return "Available"

        # If the loop completes without finding any available teacher, the course is unavailable.
        return "Unavailable"
