import http

from django.shortcuts import render, get_object_or_404
from django.views import generic
from django.shortcuts import HttpResponseRedirect
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Sum
from django.forms import Form

from various.views.pomocne import formularOKView

from various.models import Nastaveni
from prednasky.models import Prednaska, Hlasovani, Seznam, STAV_NAVRH
from soustredeni.models import Soustredeni
from personalni.models import Osoba

def newPrednaska(request):
	# hlasovani se vztahuje k nejnovejsimu soustredeni
	sous = Nastaveni.get_solo().aktualni_sous
	seznam = Seznam.objects.filter(soustredeni = sous, stav = STAV_NAVRH).first()
	if sous is None or seznam is None:
		return render(request, 'universal.html', {
			'title': "Nelze hlasovat",
			'text': "Není žádný seznam přednášek, o kterém by se dalo hlasovat.",
		}, status=http.HTTPStatus.NOT_FOUND)
	osoba = Osoba.objects.filter(user=request.user).first()
	ucastnik = osoba.plne_jmeno() + ' ' + str(osoba.id)
	# obsluha formulare
	if request.method == 'POST':
		form = Form(request.POST, request.FILES)
		if form.is_valid():
			# id z důvodu duplicitních jmen (přechod z jména na objekt Osoby nějak kape na tom,
			# že všechna předchozí hlasování zde mají náhodný string…)
			# TODO Změnit to na Osobu

			# TODO v následujících řádcích je zbytečně mnoho dotazů na QuerySet (pokud účastník hlasoval, hlasoval u všech)
			for i in request.POST:
				if i[0] == 'q':
					prednaska = Prednaska.objects.filter(pk=int(i[1:]))[0]
					hlasovani = Hlasovani.objects.filter(ucastnik=ucastnik, prednaska=prednaska).first()
					if not hlasovani:
						hlasovani = Hlasovani()
						hlasovani.prednaska = prednaska
						hlasovani.ucastnik = ucastnik
						hlasovani.seznam = seznam
					hlasovani.body = int(request.POST[i])
					hlasovani.save()

			# presmerovani na prave vzniklou galerii
			return HttpResponseRedirect('./hotovo')

	def prednaska_hodnoceni(prednaska):
		h = Hlasovani.objects.filter(ucastnik=ucastnik, prednaska=prednaska).first()
		if h:
			return prednaska, h.body
		else:
			return prednaska, 0

	return render(
		request,
		'prednasky/base.html',
		{'prednasky': map(prednaska_hodnoceni, seznam.prednaska_set.all())}
	)


def Prednaska_hotovo(request):
	return formularOKView(request, "Děkujeme za vyplnění hlasování o přednáškách a těšíme se na soustředění.")

class MetaSeznamListView(generic.ListView):
	model = Seznam
	template_name = 'prednasky/metaseznam_prednasek.html'


class SeznamListView(generic.ListView):
	template_name = 'prednasky/seznam_prednasek.html'

	def get_queryset(self):
		self.seznam = get_object_or_404(Seznam, id=self.kwargs["seznam"])
		prednasky = Prednaska.objects.filter(seznamy=self.seznam).order_by(
			'org__osoba__user__first_name', 'org__osoba__user__last_name'
		)
		return prednasky

	# FIXME nahradit anotaci s filtrem po prechodu na Django 2.2
	def get_context_data(self,**kwargs):
		context = super(SeznamListView, self).get_context_data(**kwargs)

		# hlasovani se vztahuje k nejnovejsimu soustredeni
		sous = Soustredeni.objects.first()
		seznam = Seznam.objects.filter(soustredeni = sous, stav = STAV_NAVRH).first()
	
		for obj in self.object_list:
			hlasovani_set = obj.hlasovani_set.filter(seznam=seznam).only('body')
			obj.body = sum(map(lambda x: x.body,hlasovani_set))

		return context


def SeznamExportView(request, seznam):
	"""Vypíše výsledky hlasování ve formátu pro prologovský optimalizátor"""
	# TODO zřejmě se nepoužívá, časem vyřadit? nahradit tabulkou vhodnější pro
	# lidi?
	hlasovani = Hlasovani.objects.filter(seznam=seznam)
	prednasky = Prednaska.objects.filter(seznamy=seznam)
	orgove = set(p.org for p in prednasky)
	ucastnici = set(h.ucastnik for h in hlasovani)

	for p in prednasky:
		p.body = []
		for u in ucastnici:
			try:
				p.body.append(hlasovani.get(ucastnik=u, prednaska=p).body)
			except ObjectDoesNotExist:
				# účastník nehlasoval
				p.body.append("?")

	for h in hlasovani:
		h.ucastnik = hash(h.ucastnik)

	return render(
		request,
		'prednasky/seznam_prednasek_export.txt',
		{"hlasovani": hlasovani, "prednasky": prednasky, "orgove": orgove},
		content_type="text/plain"
	)