from django.views import generic
from django.db.models import Count,Q

from .models import Oprava, KorekturovanePDF, KorekturaTag

class KorekturyListView(generic.ListView):
	model = KorekturovanePDF
	queryset = KorekturovanePDF.objects.annotate(
		k_oprave_cnt=Count('oprava',distinct=True,filter=Q(oprava__status=Oprava.STATUS.K_OPRAVE)),
		opraveno_cnt=Count('oprava',distinct=True,filter=Q(oprava__status=Oprava.STATUS.OPRAVENO)),
		neni_chyba_cnt=Count('oprava',distinct=True,filter=Q(oprava__status=Oprava.STATUS.NENI_CHYBA)),
		k_zaneseni_cnt=Count('oprava',distinct=True,filter=Q(oprava__status=Oprava.STATUS.K_ZANESENI)),
		)
	template_name = 'korektury/seznam.html'

class KorekturyAktualniListView(KorekturyListView):
	def get_queryset(self, *args, **kwargs):
		queryset=super().get_queryset()
		queryset=queryset.exclude(status="zastarale")
		return queryset

	def get_context_data(self, **kwargs):
		context = super().get_context_data(**kwargs)
		context['selected'] = 'aktualni'
		return context



class KorekturyZastaraleListView(KorekturyListView):
	def get_queryset(self, *args, **kwargs):
		queryset=super().get_queryset()
		queryset=queryset.filter(status="zastarale").order_by("-cas")
		return queryset

	def get_context_data(self, **kwargs):
		context = super().get_context_data(**kwargs)
		context['selected'] = 'zastarale'
		return context

class KorekturySeskupeneListView(KorekturyAktualniListView):
	template_name = 'korektury/seskupeny_seznam.html'

	# {% regroup %} potřebuje dostat správně setříděné názvy, aby nedělal duplikáty
	def get_queryset(self, *args, **kwargs):
		qs = super().get_queryset(**kwargs)
		return reversed(sorted(qs, key=lambda it: it.cislo_a_tema))

### Korektury
class KorekturyView(generic.DetailView):
	model = KorekturovanePDF
	pk_url_kwarg = "pdf"
	template_name = 'korektury/korekturovatko/htmlstrana.html'

	def get_context_data(self, **kwargs):
		context = super().get_context_data(**kwargs)
		context['img_indexes'] = range(self.object.stran)
		context['tagy'] = KorekturaTag.objects.all()
		return context