# !Attention! En page 1, "La chaque" doit être remplacé par "Chaque".
# !Attention! Multiples virgules en trop dans l'exemple de la question 2.

#############################################################################
# Jeux de données fournis                                                   #
#############################################################################
from plantes import plantes
from mesures import mesures

#############################################################################
# Écrire le code de la fonction croissance_moyenne de la question 1         #
#############################################################################

def croissance_moyenne(plantes):
    """Calcule la moyenne des durées de croissance des plantes à partir de la
    liste de plantes. Si la liste est vide, renvoie None."""
    if plantes == []:
        return None
    total_croissance = 0
    for plante in plantes:
        total_croissance += plante.croissance
    return total_croissance / len(plantes)

def test_croissance_moyenne():
    plantes_test = plantes[:2]  # Utilise les 2 premières plantes pour le test
    assert croissance_moyenne(plantes_test) == 70.0
    assert croissance_moyenne([]) is None
    
test_croissance_moyenne()

#############################################################################
# Écrire le code de la fonction dictionnaire_mesure de la question 2      #
#############################################################################

def dictionnaire_mesure(plantes, mesures):
    """Construit un dictionnaire associant à chaque plante de la liste plantes
    la liste des mesures correspondantes dans la liste mesures."""
    dico = {}
    for plante in plantes:
        dico[plante.nom] = []
        for mesure in mesures:
            if mesure['plante'] == plante.nom:
                dico[plante.nom].append(mesure)
    return dico

def test_dictionnaire_mesure():
    dico = dictionnaire_mesure(plantes, mesures)
    assert 'Basilic' in dico
    assert len(dico['Basilic']) == 60
    assert dico['Basilic'][0]['temperature'] == 29.3

test_dictionnaire_mesure()

#############################################################################
# Fonction défaillante à analyser et corriger pour les questions 3 et 4     #
#############################################################################

def purger_mesures_extremes(liste_mesures):
    """
    Supprime de la liste toutes les mesures dont la température 
    n'est pas comprise entre 20 et 25°C inclus.
    """
    liste_filtrée = []
    for mesure in liste_mesures:
        if 20 <= mesure['temperature'] <= 25:
            liste_filtrée.append(mesure)
    # Si on veut modifier la liste en place, on peut faire :
    # liste_mesures[:] = liste_filtrée
    return liste_filtrée

def test_purger():
    mesures_test = [
         {'jour': 1, 'plante': 'Basilic', 'temperature': 18.0},
         {'jour': 2, 'plante': 'Basilic', 'temperature': 19.0},
         {'jour': 3, 'plante': 'Basilic', 'temperature': 22.0},
         {'jour': 4, 'plante': 'Basilic', 'temperature': 28.0},
         {'jour': 5, 'plante': 'Basilic', 'temperature': 29.0}
    ]

    mesures_test = purger_mesures_extremes(mesures_test)

    print("Résultat après la purge :")
    for m in mesures_test:
        print(f"Jour {m['jour']} : {m['temperature']}°C")
        
test_purger()

# Question 3
# La fonction purger_mesures_extremes modifie la liste en place 
# (étrange vu qu'on retourne la liste modifiée...), ce qui peut
# causer des problèmes lors de l'itération : lorsque des éléments sont 
# supprimés de la liste pendant l'itération, cela peut entraîner des sauts 
# d'éléments. C'est bien le cas ici : le jour 2 a été sauté car le jour 1
# supprimé, et le jour 5 sauté car le jour 4 supprimé.