from django.contrib.auth import get_user_model
from django.db.models import Q
from django.http import Http404
from django.views.generic import TemplateView

from gestioncof.decorators import buro_required
from shared.views import autocomplete

User = get_user_model()


class COFMemberSearch(autocomplete.ModelSearch):
    model = User
    search_fields = ["username", "first_name", "last_name"]

    def get_queryset_filter(self, *args, **kwargs):
        qset_filter = super().get_queryset_filter(*args, **kwargs)
        qset_filter &= Q(profile__is_cof=True)
        return qset_filter


class COFOthersSearch(autocomplete.ModelSearch):
    model = User
    search_fields = ["username", "first_name", "last_name"]

    def get_queryset_filter(self, *args, **kwargs):
        qset_filter = super().get_queryset_filter(*args, **kwargs)
        qset_filter &= Q(profile__is_cof=False)
        return qset_filter


class COFSearch(autocomplete.Compose):
    search_units = [
        ("members", "username", COFMemberSearch),
        ("others", "username", COFOthersSearch),
        ("clippers", "clipper", autocomplete.LDAPSearch),
    ]


cof_search = COFSearch()


class AutocompleteView(TemplateView):
    template_name = "gestioncof/search_results.html"

    def get_context_data(self, *args, **kwargs):
        ctx = super().get_context_data(*args, **kwargs)
        if "q" not in self.request.GET:
            raise Http404
        q = self.request.GET["q"]
        ctx["q"] = q
        ctx.update(cof_search.search(q.split()))
        return ctx


autocomplete = buro_required(AutocompleteView.as_view())
