# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-29 03:26
from __future__ import unicode_literals

from django.db import migrations

from django.db.models import Q

def nastav_koren(koren, node):
	node.root = koren
	node.save()
	
	if node.succ:
		nastav_koren(koren, node.succ)
	if node.first_child:
		nastav_koren(koren, node.first_child)

def pridej_potomka(rodic, potomek):
	# Daný vrchol bude posledním potomkem rodiče
	uz_ma_deti = False
	posledni = None

	# Přidávaný potomek by neměl mít následovníka -- přidáváme potomka, ne podles.
	if potomek.succ:
		raise ValueError("Potomek má následovníka, to je velmi podezřelé!")

	# Najdeme aktuálně posledního potomka:
	if rodic.first_child:
		uz_ma_deti = True
		posledni = rodic.first_child
		while posledni.succ:
			posledni = posledni.succ

	# Nastavíme kořen:
	nastav_koren(rodic.root, potomek)

	# Připojíme vrchol:
	if uz_ma_deti:
		posledni.succ = potomek
		posledni.save()
	else:
		rodic.first_child = potomek
		rodic.save()

def pokacej_les(apps, schema_editor):
	# Teď je potřeba všechny TreeNody příslušející k zadaným problémům připojit
	# do hlavního stromu
	# Tohle je jednoduchá verze: nejdřív témátka a seriály, pak úložky a pohádky,
	# pak články a konfery, pak vzoráky, všechno setříděné podle kódu (FIXME?)

	# Kopírování je častým zdrojem chyb!
	Cislo = apps.get_model('seminar', 'Cislo')
	Tema = apps.get_model('seminar', 'Tema')
	Konfera = apps.get_model('seminar', 'Konfera')
	Clanek = apps.get_model('seminar', 'Clanek')
	Uloha = apps.get_model('seminar', 'Uloha')
	Problem = apps.get_model('seminar', 'Problem')
	Pohadka = apps.get_model('seminar', 'Pohadka')

	for c in Cislo.objects.all().reverse():
		cnode = c.cislonode

		# Témata a seriály:
		relevantni_temata = Tema.objects.filter(Q(cislo_zadani_old = c) | Q(cislo_reseni_old = c)).order_by('kod')
		# Téma dáme do prvního čísla, kde se vyskytne
		for t in relevantni_temata:
			tnodes = t.temavcislenode_set.all()
			# Migrujeme, TvCN je jen jedno dohromady
			assert(len(tnodes) == 1)
			tnode = tnodes[0]
			# Zkontrolujeme a preskocime cislo_reseni
			if t.cislo_zadani_old and t.cislo_reseni_old:
				assert(t.cislo_zadani_old.rocnik == t.cislo_reseni_old.rocnik
					and t.cislo_zadani_old.cislo <= t.cislo_reseni_old.cislo)
				if t.cislo_reseni_old == c:
					# Už by mělo být přidané do čísla zadání
					continue
			# Patří sem (buď je to jediné číslo, nebo je to číslo zadání)
			pridej_potomka(cnode, tnode)

		# Úložky (zadání) a pohádky
		for u in Uloha.objects.filter(cislo_zadani = c).order_by('kod'):
			unode = u.ulohazadaninode
			pohadky_pred = Pohadka.objects.filter(uloha_old = u.problem_ptr, pred = True)
			pohadky_po = Pohadka.objects.filter(uloha_old = u.problem_ptr, pred = False)
			for p in pohadky_pred:
				pnode = p.pohadkanode
				pridej_potomka(cnode, pnode)
			pridej_potomka(cnode, unode)
			for p in pohadky_po:
				pnode = p.pohadkanode
				pridej_potomka(cnode, pnode)

		# Pohádky, které nejsou u úlohy jsou špatně:
		if Pohadka.objects.exclude(uloha_old__typ='uloha').count():
			raise ValueError("Existuje pohádka, která není u úlohy")

		# Články
		for cl in Clanek.objects.filter(cislo = c).order_by('kod'):
			# Zmena: Clanky nemaji vlastni Node, ale pouziva se ReseniNode v text_cely
			reseni = cl.reseni_set.all()
			if len(reseni) != 1:
				raise ValueError('Clanek ma vic reseni')
			resnode = reseni[0].text_cely
			pridej_potomka(cnode, resnode)

		# Konfery
		for k in Konfera.objects.all():
			knode = k.konferanode
			if k.reseni and knode.root is None:
				# Takováhle konfera nejspíš neexistuje
				raise NotImplementedError("Konfery neumím zapojit do stromu")

		# Vzoráky
		for u in Uloha.objects.filter(cislo_reseni = c).order_by('kod'):
			unode = u.ulohavzoraknode
			pridej_potomka(cnode, unode)


class Migration(migrations.Migration):

	dependencies = [
		('seminar', '0059_vytvorit_pohadkanode'),
	]

	operations = [
		migrations.RunPython(pokacej_les, migrations.RunPython.noop),
	]