import logging
import datetime
import random
from typing import Sequence

import lorem

from .models import Soustredeni, Konfera
from tvorba.models import Rocnik
import personalni.models as pm

logger = logging.getLogger(__name__)


def gen_soustredeni(
		size: int,
		resitele: Sequence[pm.Resitel],
		organizatori: Sequence[pm.Organizator],
		rnd: random.Random = None,
) -> Sequence[Soustredeni]:
	logger.info('Generuji soustředění (size={})...')
	rnd = rnd or random.Random(x=42)

	soustredeni = []
	for _ in range(1, 10):  # FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
		datum_zacatku = datetime.date(rnd.randint(2000, 2020), rnd.randint(1, 12), rnd.randint(1, 28))
		working_sous = Soustredeni.objects.create(
			rocnik=Rocnik.objects.order_by('?').first(),
			verejne_db=rnd.choice([True, False]),
			misto=rnd.choice(['Kremrolovice', 'Indiánov', 'U zmzliny', 'Vafláreň', 'Větrník', 'Horní Rakvička', 'Dolní cheesecake']),
			typ=rnd.choice(['jarni', 'podzimni', 'vikend']),
			datum_zacatku=datum_zacatku,
			datum_konce=datum_zacatku + datetime.timedelta(days=7))
		ucastnici = rnd.sample(resitele, min(len(resitele), 20))
		working_sous.ucastnici.set(ucastnici)
		orgove_vyber = rnd.sample(organizatori, min(len(organizatori), 20))
		working_sous.organizatori.set(orgove_vyber)
		working_sous.save()
		soustredeni.append(working_sous)
	return soustredeni


def gen_konfery(
		size: int,
		organizatori: Sequence[pm.Organizator],
		soustredeni: Sequence[Soustredeni],
		resitele: Sequence[pm.Resitel] = None,
		rnd: random.Random = None,
) -> Sequence[Konfera]:
	logger.info('Generuji konfery (size={})...'.format(size))
	rnd = rnd or random.Random(x=42)

	konfery = []
	for _ in range(1, size):  # FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
		# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,
		# kolik dat se nageneruje
		konfera = Konfera.objects.create(
			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']),
			anotace=lorem.paragraph(),
			abstrakt=lorem.paragraph(),
			garant=rnd.choice(organizatori),
			soustredeni=rnd.choice(soustredeni),
			typ_prezentace=rnd.choice(['veletrh', 'prezentace']))
		ucastnici_sous = resitele if resitele else list(konfera.soustredeni.ucastnici.all())
		ucastnici = rnd.sample(ucastnici_sous, min(len(ucastnici_sous), rnd.randint(3, 6)))
		konfera.ucastnici.set(ucastnici)
		konfera.save()
		konfery.append(konfera)
	return konfery