package Commande;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Vector;

public class Produit implements Cloneable,Serializable{
	
	private static final long serialVersionUID = -572686317662108166L;
	private String libelle;
	private int numWagon;
	private Vector <Produit> mesProduitsIncompatibles;
	
	// ----------------------------------------- CONSTRUCTEURS ------------------------------------------------
	
	public Produit(String nom_produit){
		libelle = nom_produit;		
		mesProduitsIncompatibles = new Vector<Produit>();
		numWagon = -1;		
	}
	
	// ------------------------------------------- OBSERVATEURS ----------------------------------------------
	
	public int recNumWagon(){
		if(estAffecte())
			return numWagon;
		else{
			System.out.println("\nERREUR PRODUIT '"+libelle+"'\nImpossible de recuperer le numero du wagon de ce produit car il n'a pas encore ete affecte!\n");
			return -1;
		}
	}
	
	public String recLibelle(){
		return libelle;
	}
	
	public boolean estAffecte(){
		if(numWagon==-1)
			return false;
		return true;
	}
	
	public int recNombreIncompatiblites(){
		return mesProduitsIncompatibles.size();
	}
	
	public Vector <Produit> recProduitsIncompatibles(){
		return (Vector<Produit>)mesProduitsIncompatibles.clone();
	}
	
	// ------------------------------------------- TRANSFORMATEURS ----------------------------------------------
	
	/**
	 * Mï¿½thode qui permet d'ajouter un produit incompatible
	 * Retourne false et affiche un message d'erreur si le produit est dï¿½jï¿½ incompatible ou s'il est incompatible avec lui-mï¿½me
	 */
	public boolean ajouterProduitIncompatible(Produit newProd){
	
		// un produit ne peut pas etre incompatible avec lui-meme
		if(this.libelle.equals(newProd.recLibelle())){
			System.out.println("\nERREUR PRODUIT '"+libelle+"'\nUn produit ne peut pas etre incompatible avec lui-meme!\n");
			return false;
		}
		// on ne peut pas ajouter une incompatibilite qui existe deja
		for(Produit currentProd : mesProduitsIncompatibles){
			if(currentProd.recLibelle().equals(newProd.libelle)){
				System.out.println("\nERREUR PRODUIT '"+libelle+"'\nLe produit '"+newProd.recLibelle()+"' est deja incompatible!\n");
				return false;
			}
		}
		
		// on peut ajouter le produit dans la liste des produits incompatibles
		mesProduitsIncompatibles.add(newProd);
		return true;
		
	}
	
	public void affecterNumWagon(int num){
		numWagon = num;				
	}
	
	public Object clone() {
	    Produit p = null;
	    try {
	    	// On récupère l'instance à renvoyer par l'appel de la 
	      	// méthode super.clone()
	      	p = (Produit) super.clone();
	    } catch(CloneNotSupportedException cnse) {
	      	// Ne devrait jamais arriver car nous implémentons 
	      	// l'interface Cloneable
	      	cnse.printStackTrace(System.err);
	    }
	    
	    p.mesProduitsIncompatibles = (Vector <Produit>) mesProduitsIncompatibles.clone();
	    
	    // on renvoie le clone
	    return p;
	}
	
	// ----------------------------------------- TEST ------------------------------------------------
	
	public static void main(String[]args){
		Produit p = new Produit("Jambon");
		p.affecterNumWagon(3);		
		System.out.println("Produit : "+p.recLibelle()+"\nNumWagon : "+p.recNumWagon());
		Produit p2 = new Produit("Pain");
		Produit p3 = new Produit("Concombre");
		Produit p4 = new Produit("Tomate");
		Produit p5 = new Produit("Oeuf");
		p.ajouterProduitIncompatible(p4);
		p.ajouterProduitIncompatible(p2);
		p.ajouterProduitIncompatible(p3);
		p.ajouterProduitIncompatible(p5);
		p.ajouterProduitIncompatible(p);
		for(int i=0 ; i<p.mesProduitsIncompatibles.size(); i++){
			System.out.println(p.mesProduitsIncompatibles.elementAt(i).recLibelle());
		}
	}

	public void afficher() {
		System.out.println(this.libelle);
		
	}
	


}