package controler.connection;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

import javax.swing.JOptionPane;

import language.Language;
import tool.security.AES;
import view.Fenetre;
import view.FactoryPrincipale.PrincipaleGestionFactory;
import view.FactoryPrincipale.PrincipaleReceptionFactory;
import view.FactoryPrincipale.PrincipaleSpectateurFactory;
import view.vueConnectionPanel.VueConnection;
import view.vuePopup.JObservablePopup;
import view.vuePopup.PopupNouveauMotdepasse;

import commander.Commander;

import controler.Message;
import database.migration.SqlFactory;

public class ControleurConnection {

	private static final String cle = "7196212627131220731";
	
	public static final Message attemptLogin = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueConnection))
				return;
			VueConnection vue = (VueConnection)caster;
			Language lang = vue.getLang();
			Connection connection = Commander.getInstance().getConnectionBD();
			
			String user = vue.getUser();
			String password = new String(vue.getPassword());
			if(!"".equals(password))
				password = AES.encrypt(cle, password);
			
			try {
				List<Map<String,Object>>result = SqlFactory.query(connection, "SELECT employe_p_id, groupe_utilisateur_nom FROM view_utilisateur WHERE utilisateur_nom = '"+user+"' AND utilisateur_motdepasse = '"+password+"'");
				
				if(result.isEmpty())
				{
					user = "";
					vue.alertConnectionFailed();
				}
				else
				{
					if("".equals(new String(password)))
					{
						JObservablePopup popup = new PopupNouveauMotdepasse();
						int answer = JOptionPane.showConfirmDialog(null, popup,lang.getErreur_Connexion_Titre(),JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
						if(answer == JOptionPane.OK_OPTION)
						{
							String newPassword = popup.toString();
							if(!"".equals(newPassword))
							{
								newPassword = String.valueOf(AES.encrypt(cle, new String(newPassword)));
								SqlFactory.exec(connection, "UPDATE utilisateur SET utilisateur_motdepasse='"+newPassword+"' WHERE utilisateur_nom = '"+user+"'");
							}
							else
							{
								vue.alertConfirmationFailed();
								return;
							}
						}
						else
						{
							return;
						}
					}
					
					Commander.clearInstance();
					Commander.getInstance().setSessionProperty("employe_p_id",result.get(0).get("employe_p_id").toString());
					String userGroup = result.get(0).get("groupe_utilisateur_nom").toString();
					
					switch(userGroup)
					{
						case "ADMINISTRATEUR":
							Commander.getInstance().setLanguage(vue.getLang());
							Commander.getInstance().initFenetre();
							Commander.getInstance().setFactory(new PrincipaleGestionFactory());
							break;
						case "RECEPTION":
							Commander.getInstance().setLanguage(vue.getLang());
							Commander.getInstance().initFenetre();
							Commander.getInstance().setFactory(new PrincipaleReceptionFactory());
							break;
						case "SPECTATEUR":
							Commander.getInstance().setLanguage(vue.getLang());
							Commander.getInstance().initFenetre();
							Commander.getInstance().setFactory(new PrincipaleSpectateurFactory());
							break;
					}
					vue.closeConnection();
					Commander.getInstance().getFenetre().setEnteteVisible(true);
					Commander.getInstance().getVuePrincipale().setSelectedTab("Plan", "Plan");
				}
			} catch (Exception e) {
				e.printStackTrace();
				user = "";
				vue.alertConnectionFailed();
			}
		}
	};

	public static final Message deconnexion = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof Fenetre))
				return;
			Commander.getInstance().emptySessionProperty();
		}
	};
}
