from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .models import Course
from teacher_management.models import Teacher
from routine.models import RoutineData
from .serializers import CourseSerializer
from permissions import DynamicModelPermission
from organization.mixins import TenantViewSetMixin
from django.db.models import Prefetch

class CourseViewSet(TenantViewSetMixin, viewsets.ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer
    permission_classes = [IsAuthenticated, DynamicModelPermission]

    @action(detail=False, methods=['post'])
    def get_courses_for_routine(self, request):
        department = request.data.get('department', None)
        year = request.data.get('year', None)
        semester = request.data.get('semester', None)
        timeslot_id = request.data.get('timeslot', None)
        day_of_week = request.data.get('day_of_week')
        routine_slug = request.data.get('routine_slug', None)

        if year is None or semester is None:
            return Response({'error': 'Year and semester parameters are required.'}, status=status.HTTP_400_BAD_REQUEST)

        from django.db.models import Q
        organization = getattr(self.request, 'organization', None)
        courses = Course.objects.filter(
            Q(department__slug__iexact=department) | Q(department__isnull=True),
            Q(year__slug__iexact=year) | Q(year__isnull=True),
            Q(semester__slug__iexact=semester) | Q(semester__isnull=True)
        ).prefetch_related(
            Prefetch(
                'teachers',
                queryset=Teacher.objects.select_related('department')
            )
        )
        if organization:
            courses = courses.filter(Q(organization=organization) | Q(is_global=True))

        routine_data_filter = Q(
            time_slot_id=timeslot_id,
            day_of_week_id=day_of_week,
            organization=organization,
            routine__status__slug='draft-routine',
        )
        if routine_slug:
            routine_data_filter &= ~Q(routine__slug=routine_slug)

        busy_teacher_ids = set(
            RoutineData.objects.filter(routine_data_filter).values_list('teacher_id', flat=True)
        )
        serializer = CourseSerializer(courses, many=True, context={'timeslot': timeslot_id, 'day_of_week': day_of_week, 'busy_teacher_ids': busy_teacher_ids})
        return Response(serializer.data)
