package controller;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Vector;

import model.posteCharge.Machine;
import model.posteCharge.Operateur;
import model.posteCharge.PosteCharge;

public class GestionPoste {

	public static Vector<PosteCharge> listePostes;
	public static Vector<Operateur> listeOperateurs;
	public static Vector<Machine> listeMachines;

	public GestionPoste(){
		listePostes = new Vector<PosteCharge>();
		listeOperateurs = new Vector<Operateur>();
		listeMachines = new Vector<Machine>();
	}

	// Serialisation des trois listes dans un fichier "postescharges.ser" a la racine du projet
	public static void sauvegarderPostes(){
		try {
			FileOutputStream fichier = new FileOutputStream("postescharges.ser");
			ObjectOutputStream oos = new ObjectOutputStream(fichier);
			oos.writeObject(listePostes);
			oos.writeObject(listeOperateurs);
			oos.writeObject(listeMachines);
			oos.flush();
			oos.close();
		}
		catch (java.io.IOException e) {
			e.printStackTrace();
		}
	}

	// Deserialisation des objets a partir du fichier "postescharges.ser" situe a la racine du projet
	@SuppressWarnings("unchecked")
	public static void restaurerPostes(){
		try {
			FileInputStream fichier = new FileInputStream ("postescharges.ser");
			ObjectInputStream ois = new ObjectInputStream (fichier);
			listePostes = (Vector<PosteCharge>) ois.readObject();
			listeOperateurs = (Vector<Operateur>) ois.readObject();
			listeMachines = (Vector<Machine>) ois.readObject();
			ois.close();
		}
		catch (java.io.IOException e) {
			// Fin de la deserialisation
			// e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	// Recherche et renvoi d'un poste dans la liste a partir de sa reference
	public static PosteCharge getPoste(String reference){
		for (int i=0;i<listePostes.size();i++){
			if (reference.equals(listePostes.get(i).getReference())) return listePostes.get(i);
		}
		return null;
	}

	// Recherche et renvoi d'un operateur dans la liste a partir de sa reference
	public static Operateur getOperateur(String reference){
		for (int i=0;i<listeOperateurs.size();i++){
			if (reference.equals(listeOperateurs.get(i).getReference())) return listeOperateurs.get(i);
		}
		return null;
	}

	// Recherche et renvoi d'une machine dans la liste a partir de sa reference
	public static Machine getMachine(String reference){
		for (int i=0;i<listeMachines.size();i++){
			if (reference.equals(listeMachines.get(i).getReference())) return listeMachines.get(i);
		}
		return null;
	}

	// Cree un poste a partir des infos fournies
	public static void creerPoste(String nom, int tempDemande){
		listePostes.add(new PosteCharge(nom,tempDemande));
	}

	// Cree un operateur a partir des infos fournies
	public static void creerOperateur(String qualifications, String nom){
		listeOperateurs.add(new Operateur(qualifications,nom));
	}

	// Cree une machine a partir des infos fournies
	public static void creerMachine(String designation){
		listeMachines.add(new Machine(designation));
	}

	// Cree un poste a partir d'un poste existant
	public static void creerPoste(PosteCharge poste){
		listePostes.add(poste);
	}

	// Cree un operateur a partir d'un poste existant
	public static void creerOperateur(Operateur operateur){
		listeOperateurs.add(operateur);
	}

	// Cree une machine a partir d'un poste existant
	public static void creerMachine(Machine machine){
		listeMachines.add(machine);
	}

	// Supprime un poste a partir d'une reference
	public static boolean supprimerPoste(String reference){
		for(int i=0;i<listePostes.size();i++){
			if (reference.equals((String) listePostes.get(i).getReference())){
				listePostes.remove(i);
				return true;
			}
		}
		return false;
	}

	// Supprime un poste a partir de sa position dans la liste
	public static boolean supprimerPoste(int pos){
		if (pos<listePostes.size()){
			listePostes.remove(pos);
			return true;
		}
		else return false;
	}

	// Supprime un operateur a partir d'une reference
	public static boolean supprimerOperateur(String reference){
		for(int i=0;i<listeOperateurs.size();i++){
			if (reference.equals((String) listeOperateurs.get(i).getReference())){
				listeOperateurs.remove(i);
				return true;
			}
		}
		return false;
	}

	// Supprime un operateur a partir de sa position dans la liste
	public static boolean supprimerOperateur(int pos){
		if (pos<listeOperateurs.size()){
			listeOperateurs.remove(pos);
			return true;
		}
		else return false;
	}

	// Supprime une machine a partir d'une reference
	public static boolean supprimerMachine(String reference){
		for(int i=0;i<listeMachines.size();i++){
			if (reference.equals((String) listeMachines.get(i).getReference())){
				listeMachines.remove(i);
				return true;
			}
		}
		return false;
	}

	// Supprime un machine a partir de sa position dans la liste
	public static boolean supprimerMachine(int pos){
		if (pos<listeMachines.size()){
			listeMachines.remove(pos);
			return true;
		}
		else return false;
	}
}
