from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.views.generic import FormView, ListView

from various.views.pomocne import formularOKView
from .forms import SifrovackaForm, NapovedaForm
from .models import OdpovedUcastnika, SpravnaOdpoved, Napoveda, NapovezenoUcastnikovi, SeznamSifer
from personalni.models import Resitel


class SifrovackaView(FormView):
	template_name = 'sifrovacka/sifrovacka.html'
	form_class = SifrovackaForm

	def form_valid(self, form):
		instance = form.save(commit=False)
		resitel = Resitel.objects.get(osoba__user=self.request.user)
		instance.resitel = resitel
		instance.save()
		sifra = SpravnaOdpoved.objects.filter(sifra=instance.sifra, odpoved__iexact=instance.odpoved.strip()).first()
		if sifra is None:
			return formularOKView(self.request, f'<h1>Bohužel vám hvězdy nebyly nakloněny. Rozumějte <i>máte to blbě</i>.</h1> <p><a href="{reverse("sifrovacka")}">Zkusit znovu.</a></p><br><br><br>')

		instance.uspech = True
		instance.save()

		return formularOKView(self.request, f'<h1>{sifra.skryty_text}</h1> <p><a href="{reverse("sifrovacka")}">Odevzdat další.</a></p><br><br><br>')


class SifrovackaListView(ListView):
	template_name = 'sifrovacka/odpovedi_list.html'
	model = OdpovedUcastnika

class SifrovackaNektereListView(SifrovackaListView):
	def get_queryset(self):
		seznam = get_object_or_404(SeznamSifer, jmeno=self.kwargs['seznam'])
		orig = super().get_queryset()
		return orig.filter(sifra__in=seznam.sifry.all().values('sifra')) # poslední je kvůli tomu, že máme odkaz na celý objekt a ne jen na jméno šifry.


class NapovedaView(FormView):
	template_name = 'sifrovacka/napoveda.html'
	form_class = NapovedaForm

	def form_valid(self, form):
		instance = form.save(commit=False)
		resitel = Resitel.objects.get(osoba__user=self.request.user)
		instance.resitel = resitel

		if NapovezenoUcastnikovi.objects.filter(resitel=resitel, sifra=instance.sifra).first() is None:
			instance.save()

		napoveda = Napoveda.objects.filter(sifra=instance.sifra).first()
		return formularOKView(self.request, f'<h1>Nápověda k šifře číslo {instance.sifra} je:</h1><p>{napoveda.text}</p> <p><a href="{reverse("sifrovacka")}">Odevzdat řešení.</a></p><br><br><br>')


class NapovedaListView(ListView):
	template_name = 'sifrovacka/napovedy_list.html'
	model = NapovezenoUcastnikovi


class PreskoceniView(FormView):
	template_name = 'sifrovacka/preskoceni.html'
	form_class = SifrovackaForm
	initial = {"odpoved": "=======PŘESKOČENO======="}

	def form_valid(self, form):
		instance = form.save(commit=False)
		instance.odpoved = "=======PŘESKOČENO======="
		resitel = Resitel.objects.get(osoba__user=self.request.user)
		instance.resitel = resitel
		instance.save()
		sifra = SpravnaOdpoved.objects.filter(sifra=instance.sifra).first()  # FIXME co když je více "správných" odpovědí?

		return formularOKView(self.request, f'<h1>{sifra.skryty_text}</h1> <p><a href="{reverse("sifrovacka")}">Zpět na odevzdávátko.</a></p><br><br><br>')