"""
	Views k :mod:`dal.autocomplete` pro vyhledávání objektů nějaké třídy v databázi.
"""
from dal import autocomplete
from django.shortcuts import get_object_or_404
from django.db.models import Q

from personalni.models import Skola, Resitel
from tvorba.models import Problem
from various.models import Nastaveni
from .helpers import LoginRequiredAjaxMixin

# TODO filosofie - zkratky, jak v databázi, tak ve vyhledávání (SPŠE, GASOŠ, Kpt., soukr)
class SkolaAutocomplete(autocomplete.Select2QuerySetView):
	""" View k :mod:`dal.autocomplete` pro vyhledávání škol hlavně při registraci. """
	def get_queryset(self):
		# Don't forget to filter out results depending on the visitor !
		qs = Skola.objects.all()
		if self.q:
			words = self.q.split(' ') #TODO re split podle bileho znaku
			partq = Q()
			for w in words:	# Hledej po slovech, zahoď čárky a tečky z konců.
				if len(w) == 0:
					continue
				if w[-1] in (".",","):
					w = w[:-1]

				partq &= (Q(nazev__icontains=w)|Q(kratky_nazev__icontains=w)|Q(ulice__icontains=w)|Q(mesto__icontains=w))
			qs = qs.filter(partq)
		
		return qs

class ResitelAutocomplete(LoginRequiredAjaxMixin,autocomplete.Select2QuerySetView):
	""" View k :mod:`dal.autocomplete` pro vyhledávání řešitelů především v odevzdávátku. """
	def get_queryset(self):
		qs = Resitel.objects.all()
		if self.q:
			parts = self.q.split()
			query = Q()
			for part in parts:
				query &= (
					Q(osoba__jmeno__istartswith=part)|
					Q(osoba__prijmeni__istartswith=part)|
					Q(osoba__prezdivka__istartswith=part)
				)
			qs = qs.filter(query)
		return qs


class PublicResitelAutocomplete(LoginRequiredAjaxMixin, autocomplete.Select2QuerySetView):
	"""
		View k :mod:`dal.autocomplete` pro vyhledávání řešitelů podle přezdívky
		především v odevzdávátku.
	"""
	def get_queryset(self):
		letos = Nastaveni.get_solo().aktualni_rocnik
		qs = Resitel.objects.filter(
			rok_maturity__gte=letos.druhy_rok()
		).filter(
			prezdivka_resitele__isnull=False
		).exclude(
			prezdivka_resitele=""
		).filter(
			prezdivka_resitele__icontains=self.q
		).all()
		return qs

	def get_result_label(self, result):
		return result.prezdivka_resitele


class OdevzdatelnyProblemAutocomplete(autocomplete.Select2QuerySetView):
	""" View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """
	def get_queryset(self):
		qs = Problem.objects.filter(stav=Problem.STAV_ZADANY)
		if self.q:
			qs = qs.filter(
					Q(nazev__icontains=self.q))

		nadproblem_id = int(self.forwarded.get("nadproblem_id", -1))
		if nadproblem_id != -1:
			# Seřadíme tak, aby ty s nadproblem==None byly dole (větší motivace tam naklikat konkrétní úlohy) a pak nějak rozumně.
			# Tohle je řazení pro odevzdávátko, kde je definován nadproblém, proto je to v tomto ifu. (Jinde si to netroufám řadit)
			qs = qs.order_by("nadproblem", "kod", "nazev")
			qs = list(filter(lambda problem: problem.hlavni_problem.id == nadproblem_id, qs))
		return qs

class ProblemAutocomplete(autocomplete.Select2QuerySetView):
	""" View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """
	def get_queryset(self):
		# FIXME i starší úlohy
		nastaveni = get_object_or_404(Nastaveni)
		rocnik = nastaveni.aktualni_rocnik
		temaQ = Q(Tema___rocnik = rocnik)
		ulohaQ = Q(Uloha___cislo_zadani__rocnik=rocnik)
		clanekQ = Q(Clanek___cislo__rocnik=rocnik)
		qs = Problem.objects.filter(temaQ | ulohaQ | clanekQ).order_by("-stav", "nazev")
		if self.q:
			qs = qs.filter(
					Q(nazev__icontains=self.q))
		return qs

# Ceka na autocomplete v3
# class OrganizatorAutocomplete(autocomplete.Select2QuerySetView):
# 	def get_queryset(self):
# 		if not self.request.user.is_authenticated():
# 			return Organizator.objects.none()
#
# 		qs = aktivniOrganizatori()
#
# 		if self.q:
# 			if self.q[0] == "!":
# 				qs = Organizator.objects.all()
# 				query = self.q[1:]
# 			else:
# 				query = self.q
# 			qs = qs.filter(
# 				Q(prezdivka__isstartswith=query)|
# 				Q(user__first_name__isstartswith=query)|
# 				Q(user__last_name__isstartswith=query))
#
# 		return qs