package velo;
import visite.Visitable;
import visite.Visiteur;

/**
 * Classe Vélo.
 *
 * @author gwendal.letareau
 *
 */
public class Velo implements Visitable {

  String modele;
  int numeroSerie;
  static int dernierNumeroSerie = 0;

  Marque marque;
  Pneu pneuAvant;
  Pneu pneuArriere;
  Batterie laBatterie;

  /**
   * Constructeurs définissant le modèle et le numéro de série.
   *
   * @param modele Modèle du vélo.
   */
  public Velo(String modele, Marque marque) {
    this.modele = modele;
    this.marque = marque;

    this.numeroSerie = ++Velo.dernierNumeroSerie;
    // Velo.dernierNumeroSerie++;
  }

  /**
   * Constructeurs définissant tous les attributs.
   *
   * @param modele Modèle du vélo.
   * @param marque Marque du vélo.
   * @param pneuAvant Pneu avant du vélo.
   * @param pneuArriere Pneu arrière du vélo.
   * @param batterie Batterie du vélo.
   */
  public Velo(String modele, Marque marque, Pneu pneuAvant, Pneu pneuArriere, Batterie batterie) {
    this(modele, marque);

    this.pneuAvant = pneuAvant;
    this.pneuArriere = pneuArriere;
    this.laBatterie = batterie;
  }
  
  /**
   * Constructeurs définissant tous les attributs.
   *
   * @param numSerie Numéro de série du vélo.
   * @param modele Modèle du vélo.
   * @param marque Marque du vélo.
   * @param pneuAvant Pneu avant du vélo.
   * @param pneuArriere Pneu arrière du vélo.
   * @param batterie Batterie du vélo.
   */
  public Velo(int numSerie, String modele, Marque marque, Pneu pneuAvant, Pneu pneuArriere, Batterie batterie) {
    this.numeroSerie = numSerie;
    this.modele = modele;
    this.marque = marque;
    this.pneuAvant = pneuAvant;
    this.pneuArriere = pneuArriere;
    this.laBatterie = batterie;
  }

  public String getModele() {
    return this.modele;
  }

  public int getNumeroSerie() {
    return this.numeroSerie;
  }

  public Marque getMarque() {
    return this.marque;
  }

  public Pneu getPneuAvant() {
    return this.pneuAvant;
  }

  public Pneu getPneuArriere() {
    return this.pneuArriere;
  }

  public Batterie getBatterie() {
    return this.laBatterie;
  }

  public void setModele(String modele) {
    this.modele = modele;
  }

  public void setMarque(Marque marque) {
    this.marque = marque;
  }

  public void setPneuAvant(Pneu pneu) {
    this.pneuAvant = pneu;
  }

  public void setPneuArriere(Pneu pneu) {
    this.pneuArriere = pneu;
  }

  public void setBatterie(Batterie batterie) {
    this.laBatterie = batterie;
  }

  @Override
  public String toString() {
    
    return "Vélo " + (this.marque != null ? this.marque.getMarque() : "X") + " _ "
    			+ (this.modele != null ? this.modele : "X") + " (" + this.numeroSerie + ")\n"
    			+ "\tpneu avant   : " + (this.pneuAvant == null   ? "null" : this.pneuAvant.toString()  )   + "\n"
    			+ "\tpneu arrière : " + (this.pneuArriere == null ? "null" : this.pneuArriere.toString()) + "\n"
    			+ "\tbatterie     : " + (this.laBatterie == null  ? "null" : this.laBatterie.toString() )  + "\n";
  }
  
  
  public void appliquer(Visiteur visiteur) {
	  visiteur.agirSur(this);
  }

}
