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

import os
import random
from datetime import timedelta

from django.utils import timezone
from django.contrib.auth.models import User, Group, Permission, ContentType
from django.core.management import call_command

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

# 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.objects.filter(name__icontains='K-Fêt').delete()

        group_chef = Group(name="K-Fêt César")
        group_boy = Group(name="K-Fêt Légionnaire")

        group_chef.save()
        group_boy.save()

        permissions_chef = Permission.objects.filter(
                    content_type__in=ContentType.objects.filter(
                        app_label='kfet'))
        permissions_boy = Permission.objects.filter(
                    codename__in=['is_team', 'perform_deposit'])

        group_chef.permissions.add(*permissions_chef)
        group_boy.permissions.add(*permissions_boy)

        # ---
        # Comptes
        # ---

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

        gaulois = CofProfile.objects.filter(user__last_name='Gaulois')
        gaulois_trigramme = map('{:03d}'.format, range(50))

        romains = CofProfile.objects.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')
