#!/usr/bin/env python3

import datetime as dt
from dateutil.relativedelta import relativedelta
from decimal import Decimal

from histauto.models import Plein, EntretienPlan, EntretienRealise, EntretienPlanning, Vehicule

from django.db.models import Sum


def generateEntretienPlanning():

    for currentVehicule in Vehicule.objects.all():
        generateEntretienPlanningForVehicule(currentVehicule)


def generateEntretienPlanningForVehicule(currentVehicule):
        today = dt.datetime.today()

        dernierKilometrage = Plein.objects.filter(vehicule=currentVehicule).order_by('-date').first()

        if dernierKilometrage is not None:
            if (today.date() - dernierKilometrage.date) > dt.timedelta(weeks=8):
                distanceHebdo = 50
            else:
                pleinList = Plein.objects.filter(vehicule=currentVehicule,
                                                 date__range=(today - dt.timedelta(weeks=8), today))
                distanceSum = pleinList.aggregate(Sum('distance'))['distance__sum']
                distanceHebdo = (distanceSum // 7) if distanceSum is not None else 50

            for currentEntretienPlan in EntretienPlan.objects.filter(vehicule=currentVehicule):
                # Dernier entretien réalisé pour cette pièce
                dernierEntretien = EntretienRealise.objects.filter(vehicule=currentVehicule,
                                                                   pieces=currentEntretienPlan.piece).order_by(
                    '-date').first()

                date_cible_distance = today + relativedelta(months=60)
                date_cible_distance_lundi = date_cible_distance - dt.timedelta(days=date_cible_distance.weekday())
                date_cible_intervalle_lundi = date_cible_distance_lundi.date()

                if dernierEntretien is not None:
                    # Calcul date en fonction du kilométrage hebdo et de la distance
                    if currentEntretienPlan.distance is not None:
                        kilometrage_cible = dernierEntretien.kilometrage + currentEntretienPlan.distance
                        nb_semaines_restantes = (kilometrage_cible - dernierKilometrage.kilometrage) / distanceHebdo
                        date_cible_distance = today + dt.timedelta(weeks=int(nb_semaines_restantes))
                        date_cible_distance_lundi = date_cible_distance - dt.timedelta(days=date_cible_distance.weekday())

                    if currentEntretienPlan.intervalle is not None:
                        # Calcul date en fonction du délai depuis le dernier entretien
                        date_cible_intervalle = dernierEntretien.date + relativedelta(months=int(currentEntretienPlan.intervalle))
                        date_cible_intervalle_lundi = date_cible_intervalle - dt.timedelta(days=date_cible_intervalle.weekday())

                    date_retenue = min(date_cible_distance_lundi.date(), date_cible_intervalle_lundi)

                    EntretienPlanning.objects.filter(vehicule=currentVehicule, piece=currentEntretienPlan.piece,
                                                     date__gt=today).delete()
                    entretienPlanning = EntretienPlanning.objects.get_or_create(vehicule=currentVehicule,
                                                                        piece=currentEntretienPlan.piece, date=date_retenue,
                                                                        kilometrage=kilometrage_cible)
