import datetime
import random
import logging

import django.contrib.auth
from django.contrib.flatpages.models import FlatPage
from django.contrib.sites.models import Site
from django.db import transaction

from personalni.models import Osoba, Organizator
from tvorba.models import Rocnik, Cislo
from various.models import Nastaveni

from korektury.testutils import create_test_pdf
from novinky.testutils import gen_novinky
from personalni.testutils import gen_organizatori, gen_osoby, gen_prijemci, gen_resitele, gen_skoly
from soustredeni.testutils import gen_soustredeni, gen_konfery
from tvorba.testutils import gen_cisla, gen_clanek, gen_dlouhe_tema, gen_rocniky, gen_temata, gen_ulohy_do_cisla, gen_ulohy_k_tematum

logger = logging.getLogger(__name__)

User = django.contrib.auth.get_user_model()


@transaction.atomic
def create_test_data(size=6, rnd=None):
	logger.info('Vyrábím testovací data (size={})...'.format(size))

	assert size >= 1
	# pevna pseudo-nahodnost
	rnd = rnd or random.Random(x=42)

	# static URL stranky
	# FIXME: nakopirovat sem vsechny z produkcni databaze
	s = Site.objects.filter(name="example.com")
	f = FlatPage.objects.create(
		url="/", title="Seminář M&M",
		content="<p>V&iacute;tejte na str&aacute;nce semin&aacute;ře MaM!</p>",
	)
	print(s)
	f.sites.add(s[0])
	f.save()

	# users
	admin = User.objects.create_superuser(
		username='admin', email='', password='admin',
	)
	os_admin = Osoba.objects.create(
		user=admin, jmeno='admin', prijmeni='admin',
		prezdivka='admin', osloveni='', email='admin@admin.admin',
		telefon='123 456 789', datum_narozeni=datetime.date(2000, 1, 1),
		ulice='admin', mesto='admin', psc='100 00',
		datum_registrace=datetime.date(2020, 9, 6),
	)
	or_admin = Organizator.objects.create(
		osoba=os_admin, organizuje_od=None, organizuje_do=None,
		strucny_popis_organizatora="Organizátor k uživateli Admin",
	)

	usernames = ['anet', 'bara', 'cyril', 'david', 'eva', 'filip']
	users = []
	for usr in usernames[:size]:
		u = User.objects.create_user(username=usr, password=usr)
		u.first_name = usr.capitalize()
		u.save()
		users.append(u)
	print(users)

	# skoly
	skoly = gen_skoly()

	# osoby
	osoby = gen_osoby(rnd, size)

	# resitele a organizatori
	last_rocnik = 25
	organizatori = gen_organizatori(rnd, osoby, last_rocnik)
	resitele = gen_resitele(rnd, osoby, skoly)

	# generování novinek
	novinky = gen_novinky(rnd, organizatori)

	# prijemci
	prijemci = gen_prijemci(rnd, osoby)

	# rocniky
	rocniky = gen_rocniky(last_rocnik, size)

	# cisla
	# rocnik_cisla je pole polí čísel (typ Cislo), vnitřní pole odpovídají jednotlivým ročníkům.
	rocnik_cisla = gen_cisla(rnd, rocniky)

	# generování obyčejných úloh do čísel
	gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)

	# generování témat, zatím v prvních třech číslech po jednom
	# FIXME: více témat
	# rocnik_temata je pole polí trojic (první číslo :int, poslední číslo :int, téma:Tema), přičemž každé vnitřní pole odpovídá ročníku a FIXME: je to takhle fuj a když to někdo vidí poprvé, tak je z toho smutný, protože vůbec neví, co se děje a co má čekat.
	rocnik_temata = gen_temata(rnd, rocniky, rocnik_cisla, organizatori)

	rocnik = Rocnik.objects.filter(rocnik=23).first()
	dlouhe_tema = gen_dlouhe_tema(
		rnd, organizatori, rocnik, "Strašně dlouhé téma",
		"MFI", 8,
	)

	# generování úloh k tématům ve všech číslech
	gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, resitele)

	# generování soustředění
	soustredeni = gen_soustredeni(size, resitele, organizatori, rnd=rnd)

	# generování konfer
	konfery = gen_konfery(size, organizatori, soustredeni, rnd=rnd)

	# vytvoreni pdf ke korekturam
	create_test_pdf(rnd, organizatori)

	# TODO: nastavi správně, kolik se čeho generuje, aby rozsahy přibližně odpovídaly
	# FIXME: misto typu ruzne typy objektu a vnoreni do sebe (Tom nechápe, co je tímto fixme míněno)
	# TODO: vytvorit temata s ruznymi vlakny
	# TODO: nagenerovat starsim rocnikum pohadku
	# TODO: nagenerovat články
	# TODO: vecpat obrázky všude, kde to jde
	# TODO: mezičíslo node
	# TODO: přidat ke konferám řešení a dát je do čísel

	# Dohackované vytvoření jednoho článku
	gen_clanek(rnd, organizatori, resitele)

	# TODO: přidat články včetně zařazení do struktury treenodů,
	# a následně otestovat konsistency check databáze z utils.py
	# pomocí stránky /stav

	# obecné nastavení semináře, musí být už přidané ročníky a čísla, jinak se nastaví divně
	nastaveni = Nastaveni.objects.create(
		aktualni_cislo=Cislo.objects.all()[1])