#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Oct 14 10:46:21 2025

@author: pjoulaud
"""

class Voiture :
    """
Permet de modéliser une voiture
    """
    # attributs de classe
    matière="acier"
    nombre_de_places=5
    longueur=4.5
    def __init__(self, couleur_utilisateur, nombre_de_km=0, a_charger=[ ]):
        """
    Constructeur
    Un arg. pos. – chaine de caractères pour la couleur de la voiture
    Deux arguments nommés :
    * nombre_de_km : Entier pour le nombre de km du véhicule
    * a_charger : Liste pour tous les objets à mettre dans le coffre
    """
        self.couleur = couleur_utilisateur
        self.km=nombre_de_km
        self.coffre= a_charger[ :]
    def avance(self, distance) :
        self.km+=distance
    def charge(self, a_charger=[ ]) :
        self.coffre+= a_charger
    def est_neuve(self):
        return self.km==0
    def vide_le_coffre(self):
        self.coffre = []
        
class Wagon:
    def __init__(self, contenu):
        "Constructeur"
        self.contenu = contenu
        self.suivant = None
    def __repr__(self):
        "Affichage dans la console"
        return f'Wagon de {self.contenu}'
    def __str__(self):
        "Conversion en string"
        return self.__repr__()        

class Train:
    def __init__(self):
        "Constructeur"
        self.premier = None
        self.nb_wagons = 0
    def est_vide(self):
        """renvoie True si ce train est vide (ne comporte aucun wagon),
        False sinon
        """
        return self.nb_wagons==0
    def donne_nb_wagons(self):
        "Renvoie le nombre de wagons de ce train"
        return self.nb_wagons
    def transporte_du(self, c):
        """Détermine si ce train transporte du {c}
        (une chaine de caractères).
        Renvoie True si c'est le cas, False sinon
        """
        wagon = self.premier
        while wagon is not None:
            if wagon.contenu == c :
                return True
            else : 
                wagon = wagon.suivant
        return False
    def ajoute_wagon(self, nouveau):
        """Ajoute un wagon à la fin de ce train.
        L'argument est le wagon à ajouter
        """
        if self.est_vide():
            self.premier = nouveau
        else:
            wagon = self.premier
            while wagon.suivant is not None:
                wagon = wagon.suivant
            wagon.suivant = nouveau
        self.nb_wagons = self.nb_wagons + 1
    def supprime_wagon_de(self, c):
        """Supprime le premier wagon de {contenu}
        Renvoie False si ce train ne contient pas de {contenu},
        True si la suppression est effectuée
        """
        if self.est_vide():
            return False
        if self.premier.contenu == c:
            self.premier = self.premier.suivant
        else:
            precedent = self.premier
            wagon = precedent.suivant
            while wagon.contenu != c:
                precedent = wagon
                wagon = wagon.suivant
                if wagon is None: # pas de "contenu" dans le train
                    return False
            precedent.suivant = wagon.suivant
            # MAJ du nombre de wagons et résultat de la fonction
            self.nb_wagons = self.nb_wagons - 1
            return True
    def __repr__(self):
        "Affichage dans la console"
        contenus_wagons = ['']
        wagon = self.premier
        while wagon is not None:
            contenus_wagons.append(str(wagon))
            wagon = wagon.suivant
        return "Locomotive" + " - ".join(contenus_wagons)
    def __str__(self):
        "Conversion en string"
        return self.__repr__()
        
# Tests
train = Train()
w1 = Wagon("blé")
train.ajoute_wagon(w1)
w2 = Wagon("riz")
train.ajoute_wagon(w2)
train.ajoute_wagon(Wagon("sable"))
assert str(train) == 'Locomotive - Wagon de blé - Wagon de riz - Wagon de sable'
assert not train.est_vide()
assert train.donne_nb_wagons() == 3
assert train.transporte_du('blé')
assert not train.transporte_du('matériel')
assert train.supprime_wagon_de('riz')
assert str(train) == 'Locomotive - Wagon de blé - Wagon de sable'
assert not train.supprime_wagon_de('riz')                  