class Processus:
    def __init__(self, PID,date_arrivee, temps_necessaire):
        self.PID = PID
        self.date_arrivee = date_arrivee
        self.temps_utilisation_CPU = 0
        self.temps_necessaire = temps_necessaire
        

        
    def execute_un_cycle(self):
        """Met à jour le temps_utilisation_CPU après l'exécution d'un
        cycle."""
        self.temps_utilisation_CPU+=1



    def est_termine(self):
        """Renvoie True si le processus est terminé, False sinon,
        en se basant sur temps_utilisation_CPU."""
        return self.temps_utilisation_CPU==self.temps_necessaire
    

def is_finish(liste_process):
    for p in liste_process:
        if p.est_termine() == False :
            return False
    return True 

    
P1 = Processus(PID=1,date_arrivee=0,temps_necessaire=7)
P2 = Processus(PID=2,date_arrivee=1,temps_necessaire=4)
P3 = Processus(PID=3,date_arrivee=1,temps_necessaire=2)
P4 = Processus(PID=4,date_arrivee=2,temps_necessaire=2)
P5 = Processus(PID=5,date_arrivee=3,temps_necessaire=1)

liste_process=[P1,P2,P3,P4,P5]

def tourniquet(liste_process, quantum):
    temps=0
    ordre_execution = []
    liste_attente = []
    while is_finish(liste_process) == False:
        print(ordre_execution, [p.PID for p in liste_attente], temps)
        if  liste_attente == []:
            temps+=1
            for p in liste_process:
                if p not in liste_attente and p.date_arrivee<=temps:
                    liste_attente.append(p)
        else:       
            # On extrait le premier processus
            processus = liste_attente.pop(0)
            compteur_tourniquet = 0
            while compteur_tourniquet != quantum and not processus.est_termine():
                ordre_execution.append(processus.PID)
                processus.execute_un_cycle()
                compteur_tourniquet = compteur_tourniquet + 1
                temps+=1
                for p in liste_process:
                    if p != processus and p not in liste_attente and p.date_arrivee<=temps:
                        liste_attente.append(p)
            if not processus.est_termine():
                liste_attente.append(processus)
    return ordre_execution

print(tourniquet(liste_process, 2))