"""
Crée des utilisateurs, des articles et des opérations aléatoires
"""

import os
import random
from datetime import timedelta

from django.contrib.auth.models import User
from django.core.management import call_command
from django.utils import timezone

from gestioncof.management.base import MyBaseCommand
from gestioncof.models import CofProfile
from kfet.auth.models import KFetGroup, KFetPermission
from kfet.models import (
    Account,
    Article,
    Checkout,
    CheckoutStatement,
    Supplier,
    SupplierArticle,
)

# 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 des utilisateurs, des articles et des opérations aléatoires"

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

        group_chef, _ = KFetGroup.objects.get_or_create(name="K-Fêt César")
        group_boy, _ = KFetGroup.objects.get_or_create(name="K-Fêt Légionnaire")

        # Give relevant permissions to both groups
        chef_perms = KFetPermission.objects.all()
        group_chef.permissions.add(*chef_perms)

        boy_perms = KFetPermission.objects.filter(
            codename__in=["is_team", "perform_deposit", "add_account", "add_transfer"]
        )
        group_boy.permissions.add(*boy_perms)

        # ---
        # Comptes
        # ---

        self.stdout.write("Création des comptes K-Fêt")

        cof_profiles = CofProfile.objects.order_by("user__username")

        gaulois = cof_profiles.filter(user__last_name="Gaulois")
        gaulois_trigramme = map("{:03d}".format, range(50))

        romains = cof_profiles.filter(user__last_name="Romain")
        romains_trigramme = map(lambda x: str(100 + x), range(99))

        created_accounts = 0
        team_accounts = 0

        for (profile, trigramme) in zip(gaulois, gaulois_trigramme):
            account, created = Account.objects.get_or_create(
                trigramme=trigramme,
                cofprofile=profile,
                defaults={"balance": random.randint(1, 999) / 10},
            )
            created_accounts += int(created)

            if profile.user.first_name == "Abraracourcix":
                profile.user.groups.add(group_chef)

        for (profile, trigramme) in zip(romains, romains_trigramme):
            account, created = Account.objects.get_or_create(
                trigramme=trigramme,
                cofprofile=profile,
                defaults={"balance": random.randint(1, 999) / 10},
            )
            created_accounts += int(created)

            if random.random() > 0.75 and created:
                profile.user.groups.add(group_boy)
                team_accounts += 1

        self.stdout.write(
            "- {:d} comptes créés, {:d} dans l'équipe K-Fêt".format(
                created_accounts, team_accounts
            )
        )

        # Compte liquide

        self.stdout.write("Création du compte liquide")
        liq_user, _ = User.objects.get_or_create(username="liquide")
        liq_profile, _ = CofProfile.objects.get_or_create(user=liq_user)
        liq_account, _ = Account.objects.get_or_create(
            cofprofile=liq_profile, trigramme="LIQ"
        )

        # Root account if existing

        root_profile = CofProfile.objects.filter(user__username="root")
        if root_profile.exists():
            self.stdout.write("Création du compte K-Fêt root")
            root_profile = root_profile.get()
            Account.objects.get_or_create(cofprofile=root_profile, trigramme="AAA")

        # ---
        # Caisse
        # ---

        checkout, created = Checkout.objects.get_or_create(
            created_by=Account.objects.get(trigramme="000"),
            name="Chaudron",
            defaults={
                "valid_from": timezone.now(),
                "valid_to": timezone.now() + timedelta(days=730),
            },
        )

        if created:
            CheckoutStatement.objects.create(
                by=Account.objects.get(trigramme="000"),
                checkout=checkout,
                balance_old=0,
                balance_new=0,
                amount_taken=0,
                amount_error=0,
            )

        # ---
        # Fournisseur
        # ---

        supplier, created = Supplier.objects.get_or_create(name="Panoramix")
        if created:
            articles = random.sample(list(Article.objects.all()), 40)
            to_create = []
            for article in articles:
                to_create.append(SupplierArticle(supplier=supplier, article=article))

            SupplierArticle.objects.bulk_create(to_create)

        # ---
        # Opérations
        # ---

        call_command("createopes", "100", "7", "--transfers=20")

        # ---
        # Wagtail CMS
        # ---

        call_command("kfet_loadwagtail")