from django.db.models import Count, Q
from django_filters.rest_framework import BooleanFilter, FilterSet

from .models import Example


class DocumentFilter(FilterSet):
    spans__isnull = BooleanFilter(field_name='spans', method='filter_annotations')
    categories__isnull = BooleanFilter(field_name='categories', method='filter_annotations')
    texts__isnull = BooleanFilter(field_name='texts', method='filter_annotations')

    def filter_annotations(self, queryset, field_name, value):
        queryset = queryset.annotate(num_annotations=Count(
            expression=field_name,
            filter=Q(**{f"{field_name}__user": self.request.user}) | Q(project__collaborative_annotation=True)
            )
        )

        should_have_annotations = not value
        if should_have_annotations:
            queryset = queryset.filter(num_annotations__gte=1)
        else:
            queryset = queryset.filter(num_annotations__lte=0)

        return queryset

    class Meta:
        model = Example
        fields = (
            'project', 'text', 'created_at', 'updated_at',
            'categories__label__id', 'spans__label__id',
            'categories__isnull', 'spans__isnull', 'texts__isnull'
        )


class ExampleFilter(FilterSet):
    confirmed = BooleanFilter(field_name='states', method='filter_by_state')

    def filter_by_state(self, queryset, field_name, is_confirmed: bool):
        queryset = queryset.annotate(
            num_confirm=Count(
                expression=field_name,
                filter=Q(**{f'{field_name}__confirmed_by': self.request.user}) |
                Q(project__collaborative_annotation=True)
            )
        )
        if is_confirmed:
            queryset = queryset.filter(num_confirm__gte=1)
        else:
            queryset = queryset.filter(num_confirm__lte=0)
        return queryset

    class Meta:
        model = Example
        fields = ('project', 'text', 'created_at', 'updated_at')