package fr.eisti.transport;

public class Voiture extends Vehicule 
		implements java.io.Serializable, Comparable<Voiture> {
	
	private static long serialVersionUID = 123456789L;
	
	private TypeMoteur moteur;
	private int kilometrage;
	
	public Voiture(String marque, String modele, TypeMoteur moteur, int kilometrage) {
		super(marque, modele);
		this.kilometrage = kilometrage;
		this.moteur = moteur;
	}
	
	public TypeMoteur getMoteur() {
		return moteur;
	}
	
	public int getKilometrage() {
		return kilometrage;
	}
	
	// éventuellement, on peut rajouter une methode setKilometrage()
	// celle-ci doit absolument être privée !!
	// cela permet d'assurer une meilleure encapsulation de l'information kilometrage
	
	// Redéfinition de la méthode de la classe Véhicule
	@Override
	public String toString() {
		return super.toString() + " " + this.getMoteur() + " " + this.getKilometrage() + "Km";
	}
	
	// Redéfinition de la méthode de la classe Véhicule
	@Override
	public boolean equals(Object o) {
		if ((o == null) || (!(o instanceof Voiture))) {
			return false;
		}
		Voiture v = (Voiture) o;
		return super.equals(v)
				&& this.getMoteur() == v.getMoteur() 	// ou equals
				&& this.getKilometrage() == v.getKilometrage();
	}
	
	// Redéfinition de la méthode de la classe Véhicule
	@Override
	public int hashCode() {
		return super.hashCode()
			+ this.getMoteur().hashCode()
			+ this.getKilometrage();
	}
	
	// Implémentation de la méthode abstraite de la classe Véhicule
	@Override
	public void deplacer() {
		this.kilometrage++;
		// ou bien :
		// setKilometrage(getKilometrage() + 1);
	}
	
	// Implémentation de la méthode de l'interface Comparable
	// NB : méthode inconsistante avec la méthode equals
	// il vaudrait mieux passer par un Comparator externe
	// pour faire une comparaison qui ne prend pas le même nombre
	// de critère que le test d'égalité equals
	@Override
	public int compareTo(Voiture v) {
		int res;
		res = this.getKilometrage() - v.getKilometrage();
		if (res == 0) {
			res = this.getMoteur().compareTo(v.getMoteur());
		}
		return res;
	} 
}