# -*- coding: utf-8 -*-
# Generated by Django 1.11.15 on 2019-05-16 20:59
from __future__ import unicode_literals

from django.db import migrations

from datetime import date

import logging

logger = logging.getLogger(__name__)

def spoj_k_organizatorum_osoby(apps, scema_editor):	
	Organizator = apps.get_model('seminar', 'Organizator')
	Resitel = apps.get_model('seminar', 'Resitel')
	Osoba = apps.get_model('seminar', 'Osoba')
	for org in Organizator.objects.all():
		
		# Spárování organizátora s osobou
		# Myšlenka: Když najdeme řešitele pro daného uživatele, tak se vezme Osoba příslušná uživateli,
		# Pokud nenajdeme uživatele, tak ještě zkusíme dohledat Osobu podle e-mailu
		user = org.user
		if user is None:
			logger.error(f'Org {org} nemá uživatele!')
			# Je to podezřelé, ale prostě vyrobíme novou osobu.
			osoba = Osoba()
			osoba.poznamka += f'\nWEB DEBUG: BUG: Osoba pro Orga {org.id} bez Uživatele'
			# Téhle osobě nejdou nastavit detaily, protože žádné nemáme.
			# Datum registrace budiž maximální
			osoba.datum_registrace = date.max
		else:
			logger.info(f'Org {org.user.email}(ID: {org.id}) má uživatele {user}')
			# 💢💢💢 Python nemá goto, ale prý má výjimky… 💢💢💢
			class EndException(Exception): pass
			try:
				# Hledáme podle uživatele
				resitele = Resitel.objects.filter(user=user)
				if resitele.count() != 0 and user is not None:
					osoba = resitele.first().osoba
					osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} spárovaná podle Uživatele Řešitele'
					logger.info(f'Našel jsem řešitele {resitele.first().email} podle uživatele, používám jeho Osobu')
					raise EndException
				
				# Hledáme podle e-mailu
				osoby = Osoba.objects.filter(email__iexact=user.email)
				if osoby.count() != 0 and user.email != '':
					osoba = osoby.first()
					if osoba.user is None:
						osoba.user = user
					osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} spárovaná podle e-mailu'
					logger.info(f'Našel jsem Osobu {osoby.first().email} podle e-mailu')
					raise EndException

				# Fallback
				logger.warning(f'Org neměl řešitele, zakládám novou Osobu.')
				osoba = Osoba(user=user)
				osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} vytvořena nová jen podle existence Uživatele'

				# Přesun informací z usera do osoby
				# pro osoby z řešitelů (jediné dosud existující osoby) již v minule migraci
				osoba.jmeno = user.first_name
				osoba.prijmeni = user.last_name
				osoba.email = user.email
				user.first_name += " (Uživatel!)"
				user.last_name += " (Uživatel!)"
				osoba.datum_registrace = min(osoba.datum_registrace, user.date_joined, key=lambda d: d if d is not None else date.max)
				user.save()

			except EndException: pass

		# Přesun informací z organizátora do jeho osoby
		osoba.prezdivka = org.prezdivka if org.prezdivka is not None else ''
		osoba.foto = org.foto
		
		# Všechno uložit
		osoba.save()
		org.osoba = osoba
		org.save()
		
def fix_problem(apps, schema_editor):
	Problem = apps.get_model('seminar', 'Problem')
	Organizator = apps.get_model('seminar', 'Organizator')
	for pr in Problem.objects.all():
		if pr.autor_old is not None:
			pr.autor = Organizator.objects.filter(osoba__user=pr.autor_old).first()
		else:
			pr.autor = None
		if pr.opravovatel is not None:
			if Organizator.objects.filter(osoba__user=pr.opravovatel).first() is not None:
				pr.opravovatele.add(Organizator.objects.filter(osoba__user=pr.opravovatel).first())
			else:
				logger.error(f'WTF, nespárovaný opravovatel {pr.opravovatel} problému {pr}')
		pr.save()

def fix_pohadka(apps, schema_editor):
	Pohadka = apps.get_model('seminar', 'Pohadka')
	Organizator = apps.get_model('seminar', 'Organizator')
	for poh in Pohadka.objects.all():
		if poh.autor_old is not None:
			poh.autor = Organizator.objects.filter(osoba__user=poh.autor_old).first()
		else:
			poh.autor = None
		poh.save()

def fix_novinka(apps, schema_editor):
	Novinky = apps.get_model('seminar', 'Novinky')
	Organizator = apps.get_model('seminar', 'Organizator')
	for nov in Novinky.objects.all():
		nov.autor = Organizator.objects.filter(osoba__user=nov.autor_old).first()
		nov.save()
	
	

class Migration(migrations.Migration):

	dependencies = [
		('seminar', '0051_resitel_to_osoba'),
	]

	operations = [
		migrations.RunPython(spoj_k_organizatorum_osoby, migrations.RunPython.noop),
		migrations.RunPython(fix_problem, migrations.RunPython.noop),
		migrations.RunPython(fix_pohadka, migrations.RunPython.noop),
		migrations.RunPython(fix_novinka, migrations.RunPython.noop),
	]