from rest_framework import serializers
from .models import Classroom
from status.serializers import StatusSerializer
from routine.models import RoutineData

from status.models import Status

class ClassroomSerializer(serializers.ModelSerializer):
    status_availability = serializers.SerializerMethodField()

    class Meta:
        model = Classroom
        fields = ('classroom_id', 'room_number', 'slug', 'building', 'capacity', 'status', 'status_availability')
        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 classroom
                try:
                    default_status = Status.objects.get(slug='available-classroom')
                    data['status'] = default_status.pk
                except Status.DoesNotExist:
                    data.pop('status', None)
        return super().to_internal_value(data)

    def get_status_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 "Available"
        
        # Check if the classroom is already scheduled for this timeslot in any non-archived routine
        is_occupied = RoutineData.objects.filter(
            time_slot_id=timeslot_id, 
            day_of_week_id=day_of_week, 
            room=obj
        ).exclude(routine__status__slug='archived-routine').exists()

        return "Unavailable" if is_occupied else "Available"

class ClassroomListSerializer(serializers.ModelSerializer):
    status = StatusSerializer()
    status_availability = serializers.SerializerMethodField()

    class Meta:
        model = Classroom
        fields = ('classroom_id', 'room_number', 'slug', 'building', 'capacity', 'status', 'status_availability')
        read_only_fields = ('slug',)

    def get_status_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 "Available"
        
        # Check if the classroom is already scheduled for this timeslot in any non-archived routine
        is_occupied = RoutineData.objects.filter(
            time_slot_id=timeslot_id, 
            day_of_week_id=day_of_week, 
            room=obj
        ).exclude(routine__status__slug='archived-routine').exists()

        return "Unavailable" if is_occupied else "Available"
