from django.db import models
from django_filters import rest_framework as filters
from rest_framework import viewsets

from ..models import Schedule
from ..serializers import ScheduleSerializer


class ScheduleFilter(filters.FilterSet):
    starts = filters.DateTimeFromToRangeFilter(field_name="starts_at")
    ends = filters.DateTimeFromToRangeFilter(field_name="ends_at")
    position_status = filters.NumberFilter()
    broadcasted = filters.NumberFilter()

    overbooked = filters.BooleanFilter(method="overbooked_filter")

    # pylint: disable=unused-argument
    def overbooked_filter(self, queryset, name, value):
        # TODO: deduplicate code using the overbooked property
        if value:
            return queryset.filter(starts_at__gte=models.F("instance__ends_at"))
        return queryset.filter(starts_at__lt=models.F("instance__ends_at"))

    class Meta:
        model = Schedule
        fields = []  # type: ignore


class ScheduleViewSet(viewsets.ModelViewSet):
    queryset = Schedule.objects.all()
    serializer_class = ScheduleSerializer
    filterset_class = ScheduleFilter
    model_permission_name = "schedule"