#include "Vehicule.hxx"
#include "Depannage.hxx"
#include "RandomGenerator.hxx"


// Ici nous avons le code de methodes virtuelles pures !
// Bien entendu comme une classe virtuelle pure ne peut avoir d'instance
// ce code est destine a etre appelle dans les classes derivees via la syntaxe 
// Vehicule::demarrer() ou Vehicule::arreter()

// Demarrer utilise l'exception std::invalid_argument si vous essayez
// de demarrer un vehicule deja en marche ou en panne


void Vehicule::demarrer()
{
  if (etat_==MARCHE)
    throw std::invalid_argument("Tentative de demarrage d'un vehicule en marche");
  if ((etat_==PANNE_LEGERE) || (etat_==PANNE_SEVERE))
    throw std::invalid_argument("Tentative de demarrage d'un vehicule en panne");

  cout << "Vehicule::demarrer : operations communes a la classe !" << endl;
  
  vitesse_=0;
  etat_=MARCHE;
};

void Vehicule::arreter()
{
  
  cout << "Vehicule::arreter : operations communes a la classe !" << endl;
  
  if (vitesse_)
    accelerer(-vitesse_);
  etat_=ARRET;
}

void Vehicule::depanner()
{
  if ((etat_==MARCHE) || (etat_==ARRET))
  {
    throw std::invalid_argument("Bouffon, on ne depanne que les vehicules en panne !");
  }
  if (depannage_)
  {
    depannage_->depanner();
    etat_=ARRET;
  }
  else
  {
      throw std::logic_error("Attention ! appel de depanner sur un objet nul :(");
  }
}

extern RandomGenerator &g;

void Vehicule::mettreEnPanne()
{
  double nombre=g.generate();
  if (nombre < 0.25)
  {
    etat_=PANNE_LEGERE;
    depannage_=&DepannageLeger;
    return;
  }
  if (nombre < 0.5)
  {
    etat_=PANNE_SEVERE;
    depannage_=&DepannageSevere;
    return;
  }
}

