"""
Crée deux tirages de test et y inscrit les utilisateurs
"""

import os
import random

from django.contrib.auth.models import User
from django.utils import timezone

from bda.models import ChoixSpectacle, Participant, Salle, Spectacle, Tirage
from bda.views import do_tirage
from gestioncof.management.base import MyBaseCommand

# Où sont stockés les fichiers json
DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data")


class Command(MyBaseCommand):
    help = "Crée deux tirages de test et y inscrit les utilisateurs."

    def handle(self, *args, **options):
        # ---
        # Tirages
        # ---

        Tirage.objects.all().delete()
        Tirage.objects.bulk_create(
            [
                Tirage(
                    title="Tirage de test 1",
                    ouverture=timezone.now() - timezone.timedelta(days=7),
                    fermeture=timezone.now(),
                    active=True,
                ),
                Tirage(
                    title="Tirage de test 2",
                    ouverture=timezone.now(),
                    fermeture=timezone.now() + timezone.timedelta(days=60),
                    active=True,
                ),
            ]
        )
        tirages = Tirage.objects.all()

        # ---
        # Salles
        # ---

        locations = self.from_json("locations.json", DATA_DIR, Salle)

        # ---
        # Spectacles
        # ---

        def show_callback(show):
            """
            Assigne un tirage, une date et un lieu à un spectacle et décide si
            les places sont sur listing.
            """
            show.tirage = random.choice(tirages)
            show.listing = bool(random.randint(0, 1))
            show.date = show.tirage.fermeture + timezone.timedelta(
                days=random.randint(60, 90)
            )
            show.location = random.choice(locations)
            return show

        shows = self.from_json("shows.json", DATA_DIR, Spectacle, show_callback)

        # ---
        # Inscriptions
        # ---

        self.stdout.write("Inscription des utilisateurs aux tirages")
        ChoixSpectacle.objects.all().delete()
        choices = []
        for user in User.objects.filter(profile__is_cof=True):
            for tirage in tirages:
                part, _ = Participant.objects.get_or_create(user=user, tirage=tirage)
                shows = random.sample(
                    list(tirage.spectacle_set.all()), tirage.spectacle_set.count() // 2
                )
                for (rank, show) in enumerate(shows):
                    choices.append(
                        ChoixSpectacle(
                            participant=part,
                            spectacle=show,
                            priority=rank + 1,
                            double_choice=random.choice(["1", "double", "autoquit"]),
                        )
                    )
        ChoixSpectacle.objects.bulk_create(choices)
        self.stdout.write("- {:d} inscriptions générées".format(len(choices)))

        # ---
        # On lance le premier tirage
        # ---

        self.stdout.write("Lancement du premier tirage")
        do_tirage(tirages[0], "dummy_token")