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 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 = Soustredeni.objects.first()
	seznam = Seznam.objects.filter(soustredeni = sous, stav = STAV_NAVRH).first()
	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 render(request, 'prednasky/hotovo.html')

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__user__first_name', 'org__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"
	)