package controller;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Vector;

import model.article.Article;
import model.gammeOperatoire.GammeOperatoire;
import model.posteCharge.Machine;
import model.posteCharge.Operateur;
import model.posteCharge.PosteCharge;

/**
 * BaseDonnees est la classe contenant toutes les données sur les objets techniques, et les fonctions statiques de serialisation et de deserialisation
 * @author Magic Penguins
 */
public class BaseDonnees {

	/**
	 * Liste des articles
	 */
	public static Vector<Article> listeArticles;
	/**
	 * Compteur qui incremente a chaque creation d'article
	 * Il sert notamment a generer la reference et le nom par defaut
	 */
	public static int cptArticles;
	/**
	 * Liste des gammes operatoires
	 */
	public static Vector<GammeOperatoire> listeGammes;
	/**
	 * Compteur qui incremente a chaque creation de gamme operatoire
	 * Il sert notamment a generer la reference et le nom par defaut
	 */
	public static int cptGammes;
	/**
	 * Liste des postes de charge
	 */
	public static Vector<PosteCharge> listePostes;
	/**
	 * Liste des operateurs
	 */
	public static Vector<Operateur> listeOperateurs;
	/**
	 * Liste des machines
	 */
	public static Vector<Machine> listeMachines;
	/**
	 * Compteur qui incremente a chaque creation de poste de charge
	 * Il sert notamment a generer la reference et le nom par defaut
	 */
	public static int cptPostes;
	/**
	 * Compteur qui incremente a chaque creation d'operateur
	 * Il sert notamment a generer la reference et le nom par defaut
	 */
	public static int cptOperateurs;
	/**
	 * Compteur qui incremente a chaque creation de machine
	 * Il sert notamment a generer la reference et le nom par defaut
	 */
	public static int cptMachines;

	/**
	 * Initialisation des attributs des classes BaseDonnees et GestionCommande
	 */
	public static void initialisation(){
		listeArticles = new Vector<Article>();
		listeGammes = new Vector<GammeOperatoire>();
		listePostes = new Vector<PosteCharge>();
		listeOperateurs = new Vector<Operateur>();
		listeMachines = new Vector<Machine>();
		GestionCommande.listeCommande = new Vector<GammeOperatoire>();
		GestionCommande.listeRupture = new Vector<Article>();
		GestionCommande.delaiDeterministe = 0;
		GestionCommande.delaiStochastique = 0;
		cptArticles = 1;
		cptGammes = 1;
		cptPostes = 1;
		cptOperateurs = 1;
		cptMachines = 1;
	}

	/**
	 * Serialisation des attributs de la classe BaseDonnees dans un fichier "data.ser" a la racine du projet
	 */
	public static void sauvegarder(){
		try {
			FileOutputStream fichier = new FileOutputStream("data.ser");
			ObjectOutputStream oos = new ObjectOutputStream(fichier);
			oos.writeObject(listeArticles);
			oos.writeObject(listeGammes);
			oos.writeObject(listePostes);
			oos.writeObject(listeOperateurs);
			oos.writeObject(listeMachines);
			oos.writeObject(cptArticles);
			oos.writeObject(cptGammes);
			oos.writeObject(cptPostes);
			oos.writeObject(cptOperateurs);
			oos.writeObject(cptMachines);
			oos.flush();
			oos.close();
		}
		catch (java.io.IOException e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("unchecked")
	/**
	 * Deserialisation des attributs de la classe BaseDonnees a partir du fichier "data.ser" situe a la racine du projet
	 */
	public static void restaurer(){
		try {
			FileInputStream fichier = new FileInputStream ("data.ser");
			ObjectInputStream ois = new ObjectInputStream (fichier);
			listeArticles = (Vector<Article>) ois.readObject();
			listeGammes = (Vector<GammeOperatoire>) ois.readObject();
			listePostes = (Vector<PosteCharge>) ois.readObject();
			listeOperateurs = (Vector<Operateur>) ois.readObject();
			listeMachines = (Vector<Machine>) ois.readObject();
			cptArticles = (Integer) ois.readObject();
			cptGammes = (Integer) ois.readObject();
			cptPostes = (Integer) ois.readObject();
			cptOperateurs = (Integer) ois.readObject();
			cptMachines = (Integer) ois.readObject();
			GestionCommande.listeCommande = new Vector<GammeOperatoire>();
			GestionCommande.listeRupture = new Vector<Article>();
			GestionCommande.delaiDeterministe = 0;
			GestionCommande.delaiStochastique = 0;
			ois.close();
		}
		catch (java.io.IOException e) {}
		catch (ClassNotFoundException e) {}
	}
}
