# importation d'un module pour rendre le jeu aleatoire
import random

# declare les variables
compteur_face = 0  # compteur pour les faces
compteur_pile = 0  # compteur pour les piles
rejouer = True     # booléenne pour la boucle principale
historique = []    # liste vide pour stocker les lancers
stats = {          # dictionnaire pour stocker les statistiques 
    "heads": {"count": 0, "percentage": 0.0},
    "tails": {"count": 0, "percentage": 0.0}
}

#fonction pour lancer la ou les pieces
def lancer_piece():
    #simule un lancer de pièce et retourne 'pile' ou 'face' de manière aléatoire
    return random.choice(["heads", "tails"])


#fonction principale
def main():
    
    # permet de modifier les variables définies en dehors de la fonction
    global compteur_face, compteur_pile, rejouer, historique, stats
    
    # boucle qui continu tant que 'rejouer' est vrai
    while rejouer:   
        
        # gestion robuste pour que la personne tape un chiffre ou un nombre 
        while True:
            
            # try / except qui gere les ereurs entres (sort de la boucle quand un chiffre 
            # ou un nombre est entre)
            try:
                nb_lancers = int(input("How many times do you want to toss the coin ? : "))
                if nb_lancers > 0:
                    break
                print("❌ Error : please enter a positive number ^^. ")
            except ValueError:
                print("❌ Error : please enter a valid number ^^. ")
        
        # affiche un message avec le nm de lancers demande
        print(f"\nHere are your {nb_lancers} live throws :\n")
        
        # réinitialisation pour une nouvelle série
        historique.clear()
        stats["heads"]["count"] = 0
        stats["tails"]["count"] = 0
        
        # boucle pour les lancers
        for i in range(1, nb_lancers + 1):
            resultat = lancer_piece()
            historique.append(resultat)  # ajout à la liste
            
            # incrementation des compteurs selon le resultat du lancer
            if resultat == "heads":
                compteur_pile += 1
                stats["heads"]["count"] += 1
            else:
                compteur_face += 1
                stats["tails"]["count"] += 1
                
            # affiche le resultat du lancer actuel
            print(f"🪙 Attempt {i} : {resultat}")
        
        # calcul des pourcentages des lancers sur 100 %
        total = nb_lancers  # on utilise le nombre demandé comme total
        stats["heads"]["percentage"] = (stats["heads"]["count"] / total) * 100
        stats["tails"]["percentage"] = (stats["tails"]["count"] / total) * 100
      
        # Affichage des stats
        print("\n📊 Statistics:")
        print(f"Heads: {stats['heads']['count']} ({stats['heads']['percentage']:.1f}%)")
        print(f"Tails: {stats['tails']['count']} ({stats['tails']['percentage']:.1f}%)")
        
        # affcihe l historique complet des lancers
        print("\n📜 History of last throws:", historique)
        
        # boucle pour rejouer oui ou non
        while True:
            choix = input("\nWould you like to play again (yes / no) ? ").lower()
            if choix == "yes":
                break
            elif choix == "no":
                rejouer = False
                print ("\nYou can't earn luck." )
                
                # gere si la personne ne rentre pas yes ou no
                break
            print("❌ Error : please answer 'yes' or 'no'.")


# point d'entrée principal du programme
if __name__ == "__main__":
    # appel de la fonction principal
    main() 
    if __name__ == "__main__":
        
        # message de fin de partie
        print("\n🔚 Programme terminé. Merci d'avoir joué !")
    


