#ifndef __VEHICULE_HXX__
#define __VEHICULE_HXX__

#include <stdexcept>
#include <iostream>

class Parc;
class Depannage;

class Vehicule
{
public:
  enum EtatVehicule {ARRET, MARCHE, PANNE_LEGERE, PANNE_SEVERE};
  
 
public:

  Vehicule(int vitesseMax=0) : 
    vitesse_(0), 
    vitesseMax_(vitesseMax), 
    etat_(ARRET),
    depannage_(0) 
  {
      cout << "Constructeur de la classe vehicule" << endl;
  }

  virtual void mettreEnPanne();

  virtual void demarrer()=0;

  virtual void arreter()=0;

  virtual void depanner();

  virtual void accelerer(int increment)
  {
    vitesse_+=increment;
     
    if (vitesse_ < 0)
    {
      vitesse_=0;
      throw std::invalid_argument("Vehicule::accelerer Tentative de vitesse negative");
    }
    else
    {
      if (vitesse_ > vitesseMax_)
      {
         vitesse_=vitesseMax_;
         throw std::invalid_argument("Vehicule::accelerer Tentative de depassement de la vitesse maximale");
      }
    }
  }

  virtual void grouper(const Vehicule &) throw (std::domain_error)
  {
    throw std::domain_error("Tentative d'application de grouper a un atome");
  }

  virtual void retirer(const Vehicule &) throw (std::domain_error)
  {
    throw std::domain_error("Tentative d'application de retirer a un atome");
  }

  virtual Parc *asParc()
  {
   return 0;
  }

  void setDepanner(Depannage *d)
  {
    depannage_=d;
  }

  virtual ~Vehicule(void)
  {
  }
  
protected:
  int        vitesse_;
  int        vitesseMax_;
  int        etat_;
  Depannage *depannage_;    
};


#endif
