from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from .models import Teacher
# from departments.serializers import DepartmentListSerializer # Removed top-level import
from status.serializers import StatusSerializer
from routine.models import RoutineData


from status.models import Status

class TeacherSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = Teacher
        fields = '__all__'
        read_only_fields = ('slug',)

    def to_internal_value(self, data):
        # Handle status slug to ID mapping
        if 'status' in data and isinstance(data['status'], str):
            try:
                status_obj = Status.objects.get(slug=data['status'])
                data['status'] = status_obj.pk
            except Status.DoesNotExist:
                # If it's a slug that doesn't exist, try getting the default for teacher
                try:
                    default_status = Status.objects.get(slug='active-teacher')
                    data['status'] = default_status.pk
                except Status.DoesNotExist:
                    data.pop('status', None)
        return super().to_internal_value(data)

    def get_name(self, obj):
        return f"{obj.first_name} {obj.last_name or ''}".strip()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Remove unique validators for code and email to handle them in validate methods
        if self.instance is not None:  # Only on update
            for field_name in ['code', 'email']:
                if field_name in self.fields:
                    self.fields[field_name].validators = [
                        v for v in self.fields[field_name].validators 
                        if not isinstance(v, UniqueValidator)
                    ]

    def validate_code(self, value):
        qs = Teacher.objects.filter(code=value)
        if self.instance:
            qs = qs.exclude(pk=self.instance.pk)
        if qs.exists():
            raise serializers.ValidationError("Teacher with this code already exists.")
        return value

    def validate_email(self, value):
        qs = Teacher.objects.filter(email=value)
        if self.instance:
            qs = qs.exclude(pk=self.instance.pk)
        if qs.exists():
            raise serializers.ValidationError("Teacher with this email already exists.")
        return value

class TeacherListSerializer(serializers.ModelSerializer):
    department = serializers.SerializerMethodField()
    status = StatusSerializer()
    availability = serializers.SerializerMethodField()
    name = serializers.SerializerMethodField()

    class Meta:
        model = Teacher
        fields = ('teacher_id', 'first_name', 'last_name', 'name', 'code', 'slug', 'department', 'email', 'phone', 'hire_date', 'status', 'availability')

    def get_name(self, obj):
        return f"{obj.first_name} {obj.last_name or ''}".strip()

    def get_department(self, obj):
        from departments.serializers import DepartmentListSerializer
        return DepartmentListSerializer(obj.department).data
    
    def get_availability(self, obj):
        timeslot_id = self.context.get('timeslot')
        day_of_week = self.context.get('day_of_week')
        if not timeslot_id or not day_of_week:
            return "Not Applicable"
        
        busy_teacher_ids = self.context.get('busy_teacher_ids', set())
        is_busy = obj.teacher_id in busy_teacher_ids
        
        if is_busy:
            return "Unavailable"
        else:
            return "Available"
