package model.gammeOperatoire;

import java.util.Vector;

import controller.BaseDonnees;

/**
 * Objet technique gamme operatoire
 * @author Magic Penguins
 *
 */
public class GammeOperatoire implements java.io.Serializable{

	private static final long serialVersionUID = 5143222288334323441L;
	
	/**
	 * Liste des activites composant la gamme operatoire
	 * @see Activite
	 */
	protected Vector<Activite> gamme;
	/**
	 * Nom de la gamme operatoire
	 */
	protected String nom;
	/**
	 * True si c'est une gamme d'assemblage, false si autre (gamme de fabrication, attente, transport ou stockage)
	 */
	protected boolean isAssemblage;
	/**
	 * Reference de la gamme operatoire
	 */
	protected String reference;
	
	public boolean isAssemblage() {
		return isAssemblage;
	}

	public void setProduction(boolean isAssemblage) {
		this.isAssemblage = isAssemblage;
	}

	public String getNom() {
		return nom;
	}
	
	/**
	 * Constructeur d'une gamme operatoire
	 * @param nom
	 * Nom de la gamme operatoire
	 * @param isAssemblage
	 * True si c'est une gamme d'assemblage, false si autre (gamme de fabrication, attente, transport ou stockage)
	 */
	public GammeOperatoire(String nom, boolean isAssemblage) {
		this.gamme=new Vector<Activite>();
		this.nom=nom;
		this.reference=model.Reference.genererReference("GOP", BaseDonnees.cptGammes);
		this.isAssemblage = isAssemblage;
		BaseDonnees.cptGammes++;
	}
	
	public Vector<Activite> getGamme() {
		return this.gamme;
	}
	
	public void addActivite(Activite a) {
		gamme.add(a);
	}
	
	public void addActivite(Activite a, int p) {
		gamme.add(p, a);
	}
	
	public void addActivite(Vector<Activite> a) {
		gamme.addAll(a);
	}
	
	public void addActivite(Vector<Activite> a, int p) {
		gamme.addAll(p, a);
	}
	
	public int getOrdre(Activite a) {
		return gamme.indexOf(a);
	}
	
	public String getReference() {
		return reference;
	}
	
	/**
	 * Echange la position de deux activites
	 * @param a1
	 * Premiere activite a echanger
	 * @param a2
	 * Deuxieme activite a echanger
	 */
	public void swapArticle(Activite a1, Activite a2) {
		swapArticle(getOrdre(a1), getOrdre(a2));
	}
	
	/**
	 * Echange la position de deux activites
	 * @param pos1
	 * Position de la premiere activite a echanger
	 * @param pos2
	 * Position de la deuxieme activite a echanger
	 */
	public void swapArticle(int pos1, int pos2) {
		Activite temp = gamme.get(pos2);
		gamme.set(pos2, gamme.get(pos1));
		gamme.set(pos1, temp);
	}
	
	/**
	 * Supprime l'activite voulue
	 * @param a
	 * Activite a supprimer
	 */
	public boolean removeActivite(Activite a) {
		return gamme.remove(a);
	}
	
	/**
	 * Supprime les activite voulues
	 * @param a
	 * Liste d'activite a supprimer
	 */
	public void removeActivite(Vector<Activite> a) {
		gamme.removeAll(a);
	}
	
	/**
	 * Calcule le temps total d'une gamme operatoire
	 * @return Le temps total d'une gamme operatoire
	 */
	public int getTotalTime() {
		int time=0;
		for(Activite a : gamme) time+=a.getDuree();
		return time;
	}
	
	/**
	 * toString d'une gamme operatoire
	 */
	@Override
	public String toString() {
		return nom+" ("+reference+")";
	}
	
	/**
	 * Calcule la duree d'une gamme operatoire de maniere deterministe
	 * @return La duree deterministe
	 */
	public int calculerDuree(){
		int duree = 0;
		for (int i=0;i<gamme.size();i++){
			duree += gamme.get(i).getDuree();
			if (gamme.get(i) instanceof Operation) {
				duree += ((Operation)gamme.get(i)).duree();
			}
		}
		return duree;
	}

}
