class Joueuse:
    def __init__(self, nom, prenom, pays, age, point):
        ''' nom, prenom et pays sont de type str,
        age et point sont de type int '''
        self.nom = nom
        self.prenom = prenom
        self.pays = pays
        self.age = age
        # nombre de points WTA
        self.point = point
        # nombre de victoires
        self.victoire = 0
        # nombre de défaites
        self.defaite = 0
    
    def __lt__(self, other):
        ''' on compare les joueuses en fonction de leur nombre de points WTA '''
        return self.point < other.point
    
    def ajouter_victoire(self, adversaire):
        self.victoire += 1
        adversaire.defaite += 1
    
    def __repr__(self):
        return self.nom
    

pegula = Joueuse("Pegula", "Jessica", "USA", 29, 6101)
gauff = Joueuse("Gauff", "Coco", "USA", 20, 6063)
paloni = Joueuse("Paloni", "Marta", "ESP", 23, 4843)
sabalenka = Joueuse("Sabalenka", "Aryna", "BLR", 25, 10541)
swiatek = Joueuse("Swiatek", "Iga", "POL", 22, 7470)
pilar = Joueuse("Pilar", "Pilar", "XXX", 30, 2000)
inie = Joueuse("Inie", "Inie", "XXX", 30, 2000)
jabeur = Joueuse("Jabeur", "Ons", "TUN", 29, 4000)

swiatek.ajouter_victoire(paloni)

liste_joueuses = [swiatek, gauff, paloni, sabalenka, pegula]

def tri_insertion(liste):
    for i in range(1, len(liste)):
        # print(liste)
        j = i
        while j > 0 and liste[j] < liste[j - 1]:
            # échange les valeurs liste[j] et liste[j-1]
            liste[j], liste[j - 1] = liste[j - 1], liste[j]
            j = j - 1

# tri_insertion(liste_joueuses)

class Match:
    def __init__(self, intitule, joueuse1, joueuse2):
        self.intitule = intitule
        self.joueuse1 = joueuse1
        self.joueuse2 = joueuse2
        self.gagnante = None
        self.perdante = None
        self.score = None
    
    def resultat_match(self, score):
        self.score = score
        nb_set_joueuse1 = 0
        nb_set_joueuse2 = 0
        for s1, s2 in score:
            if s1 > s2:
                nb_set_joueuse1 += 1
            else:
                nb_set_joueuse2 += 1
        if nb_set_joueuse1 > nb_set_joueuse2:
            self.gagnante = self.joueuse1
            self.perdante = self.joueuse2
        else:
            self.gagnante = self.joueuse2
            self.perdante = self.joueuse1
        self.gagnante.ajouter_victoire(self.perdante)

# instanciation de la finale Madrid 2024
finale_mad_24 = Match('Finale Madrid 24', swiatek, sabalenka)

# mise-à-jour du score du match
finale_mad_24.resultat_match([(7, 5), (4, 6), (7, 6)])

class Arbre:
    def __init__(self, racine, gauche, droit):
        self.racine = racine
        self.gauche = gauche
        self.droit = droit
    
    def mise_a_jour(self):
        """Met à jour les matchs de l'arbre"""
        if self.racine.joueuse1 is None:
            if self.gauche is not None:
                # mise à jour si gagnante à gauche
                if self.gauche.racine.gagnante is not None:
                    self.racine.joueuse1 = self.gauche.racine.gagnante
                else:
                    self.gauche.mise_a_jour()
        if self.racine.joueuse2 is None:
            if self.droit is not None:
                # mise à jour si gagnante à droite
                if self.droit.racine.gagnante is not None:
                    self.racine.joueuse2 = self.droit.racine.gagnante
                else:
                    self.droit.mise_a_jour()
    
# quarts de finale
Q1 = Match("Quart de finale 1", gauff, pilar)
Q2 = Match("Quart de finale 2", paloni, inie)
Q3 = Match("Quart de finale 3", pegula, sabalenka)
Q4 = Match("Quart de finale 4", swiatek, jabeur)

# demi-finale
D1 = Match("Demi-finale 1", None, None)
D2 = Match("Demi-finale 2", None, None)

# finale
F = Match("Finale", None, None)

tournoi = Arbre(F, Arbre(D1, Arbre(Q1, None, None), Arbre(Q2, None, None)), Arbre(D2, Arbre(Q3, None, None), Arbre(Q4, None, None)))

Q1.resultat_match([(6, 4), (7, 5)])
tournoi.gauche.racine.joueuse1 = gauff

