package commander;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import language.Francais;
import language.Language;
import view.Fenetre;
import view.OngletSuperieur;
import view.FactoryPrincipale.PrincipaleFactory;
import view.FactoryPrincipale.PrincipaleGestionFactory;
import view.vueConnectionPanel.VueConnection;
import database.tools.DbConnection;

/**
 * Commander (singleton)
 * @author martin
 * simple objet qui centralise l'access au model, vue et controleur.
 * il est utiliser principalement par les messages
 */
public class Commander {
	private Connection connectionBD;
	private OngletSuperieur principal;
	private PrincipaleFactory factory;
	private Fenetre fenetre;
	private Language lang;
	private Properties session;
	
	private Commander() throws Exception{
		connectionBD = null;
		lang = null;
		fenetre = null;
		factory = null;
		principal = null;
		session = new Properties();
	}
	
	/**
	 * @param key
	 * @param i
	 * @return
	 * @see java.util.Properties#setProperty(java.lang.String, java.lang.String)
	 */
	public void setSessionProperty(String key, String i) {
		session.setProperty(key, i);
	}

	/**
	 * @param key
	 * @return
	 * @see java.util.Properties#getProperty(java.lang.String)
	 */
	public String getSessionProperty(String key) {
		return session.getProperty(key);
	}

	private static Commander instance = null;
	public static Commander getInstance() throws Exception{
		if (instance==null)
			instance = new Commander();

		return instance;
	}
	
	/**
	 * obtenir la connection à la BD
	 * @return Connection
	 */
	public Connection getConnectionBD() {
		if (connectionBD==null){
			try {
				connectionBD = DbConnection.createConnection();
			} catch (ClassNotFoundException e) {
				JOptionPane.showMessageDialog(new JFrame(), "Erreur du chargement du driver de la BD, l'operation n'a pu être éxécutée");
				e.printStackTrace();
			} catch (IOException e) {
				JOptionPane.showMessageDialog(new JFrame(), "Erreur du chargement du fichier de connection à la base de donnée, l'operation n'a pu être éxécutée");
				e.printStackTrace();
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(new JFrame(), "Erreur de connection à la base de donnée, l'operation n'a pu être éxécutée");
				e.printStackTrace();
			}
		}
		return connectionBD;
	}

	/**
	 * retourne OngletSuperieur
	 * @return
	 */
	public OngletSuperieur getVuePrincipale(){
		return principal;
	}
	/**
	 * retourne la fenetre
	 * @return
	 */
	public Fenetre getFenetre(){
		return fenetre;
	}
	/**
	 * initialisation
	 * @throws IOException 
	 */
	public void initFenetre() throws IOException{
		if (fenetre == null && lang != null){
			fenetre = new Fenetre(lang, "Bonjours");
		}
	}
	/**
	 * set l'objet de langue 
	 * @param lang
	 * @throws Exception
	 */
	public void setLanguage(Language lang) throws Exception{
		this.lang = lang;
		refresh();
	}
	
	/**
	 * retourne l'objet de langue
	 * @return
	 */
	public Language getLanguage(){
		return this.lang;
	}
	
	/**
	 * set la factory de vue
	 * @param factory
	 * @throws Exception
	 */
	public void setFactory(PrincipaleFactory factory) throws Exception{
		this.factory = factory;
		refresh();
	}
	/**
	 * mettre à jour l'interface
	 * @throws Exception
	 */
	public void refresh() throws Exception{
		if (factory!=null && lang!=null && fenetre!=null){
			principal = factory.build(lang);
			fenetre.setPrincipale(principal);
		}
	}
	
	public static void main(String...arg) throws Exception{
		Language lang = Francais.getInstance();
		//add call to connection view instead of the lines below
		JFrame a = new JFrame();
		VueConnection.setLanguage(lang);
		VueConnection con = VueConnection.getInstance();
		a.add(con);
		a.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		a.pack();
		a.setVisible(true);
		/*Commander.getInstance().setFactory(new PrincipaleGestionFactory());

		Commander.getInstance().getFenetre().setEnteteVisible(true);
		
		Commander.getInstance().getVuePrincipale().setSelectedTab("Plan", "Plan");*/
		//Commander.getInstance().setSessionProperty("employe_p_id","1");
	}
}
