package controler.recherche;

import java.sql.Connection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import language.Language;
import view.vueGestionEmploye.VueGestionModifierUtilisateur;
import view.vueRechercheUtilisateur.VueRechercheUtilisateur;

import commander.Commander;

import controler.Message;
import database.crud.EmployeCrud;
import database.crud.GroupeUtilisateurCrud;
import database.crud.UtilisateurCrud;
import database.dataset.Employe;
import database.dataset.Groupe_utilisateur;
import database.dataset.Utilisateur;

/**
 * 
 * @author Alfredo Toyo
 *
 */
public class ControlerRechercheUtilisateur {
	private ControlerRechercheUtilisateur() {
	}
	
	/**
	 * 
	 */
	public static final Message reveil = new Message(){
		public void trigger(Object caster) throws Exception {
			recherche.trigger(caster);	
		}
	};
	
	/**
	 * 
	 */
	public static final Message recherche = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRechercheUtilisateur))
				return;
			VueRechercheUtilisateur vue = (VueRechercheUtilisateur)caster;
			Connection connection = Commander.getInstance().getConnectionBD();
			
			UtilisateurCrud utilisateurCrud             = new UtilisateurCrud(connection);
			GroupeUtilisateurCrud groupeUtilisateurCrud = new GroupeUtilisateurCrud(connection);
			EmployeCrud employeCrud                     = new EmployeCrud(connection);
			
			//combo groupe
			List<Groupe_utilisateur> combogroupesUtilisateur = groupeUtilisateurCrud.readAll();
			Set<Object> dejaAjouter = new HashSet<>();
			vue.clearUtilisateur();
			
			int compteur = 0;
			for(Groupe_utilisateur groupe_utilisateur : combogroupesUtilisateur){
				if (!dejaAjouter.contains("groupe"+groupe_utilisateur.getGroupe_utilisateur_nom())){
					dejaAjouter.add("groupe"+groupe_utilisateur.getGroupe_utilisateur_nom());
					if(compteur == 0)
						vue.addGroupe("");
					vue.addGroupe(""+groupe_utilisateur.getGroupe_utilisateur_nom());
					compteur++;
				}
			}
			
			String NomUtilisateur = vue.getTextFieldNomUtilisateure();
			String nom		      = vue.getTextFieldNom();
			String prenom	      = vue.getTextFieldPrenom();
			String groupe	      = vue.getSelectedGroupe();
					
			List<Utilisateur> utilisateurs = utilisateurCrud.readAllLike(NomUtilisateur, "", groupe, nom, prenom);

			for(Utilisateur utilisateur : utilisateurs){
				Groupe_utilisateur groupesUtilisateur = groupeUtilisateurCrud.readById(utilisateur.getGroupe_utilisateur_fk_id());
				List<Employe> employe = employeCrud.readByFk_utilisateur(utilisateur.getutilisateur_p_id());
				
				vue.addLineToTableUtilisateur(utilisateur.getutilisateur_p_id(),
											  utilisateur.getUtilisateur_nom(), 
											  employe.get(0).getEmploye_nom(),
											  employe.get(0).getEmploye_prenom(),
											  groupesUtilisateur.getGroupe_utilisateur_nom(), 
											  utilisateur.getUtilisateur_actif(),
											  employe.get(0).getEmploye_commentaire());
			}
		}
	};
	
	/**
	 * 
	 */
	public static final Message modifier = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRechercheUtilisateur))
				return;
			VueRechercheUtilisateur vue = (VueRechercheUtilisateur)caster;
			
			if(!vue.hasRowSelected())
				return;
			
			Language lang = Commander.getInstance().getLanguage();
			VueGestionModifierUtilisateur vueDest = (VueGestionModifierUtilisateur)Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleGestion(), 
													lang.getGestionModifierUtilisateur());		
			Commander.getInstance().getVuePrincipale().setModifiedTab(lang.getPrincipaleGestion(), lang.getGestionModifierUtilisateur(),true);	
			Connection connection = Commander.getInstance().getConnectionBD();
			
			UtilisateurCrud utilisateurCrud             = new UtilisateurCrud(connection);
			EmployeCrud employeCrud                     = new EmployeCrud(connection);
			
			GroupeUtilisateurCrud groupeUtilisateurCrud = new GroupeUtilisateurCrud(connection);
			
			int utilisateur_p_id = vue.getSelectedUtilisateur();
			Utilisateur utilisateur = utilisateurCrud.readById(utilisateur_p_id);
			Employe employe = employeCrud.readByFk_utilisateur(utilisateur_p_id).get(0);
			
			List <Groupe_utilisateur> groupesUtilisateurs = groupeUtilisateurCrud.readAll();
			String[] tableGroupeUtil = new String[groupesUtilisateurs.size()];
			String selectedGroupeUtil = "";
			vue.clear();
			
			for(int i = 0; i < groupesUtilisateurs.size(); i++)
			{
				tableGroupeUtil[i] = groupesUtilisateurs.get(i).getGroupe_utilisateur_nom();
				if(groupesUtilisateurs.get(i).getgroupe_utilisateur_p_id() == utilisateur.getGroupe_utilisateur_fk_id()){
					selectedGroupeUtil = groupesUtilisateurs.get(i).getGroupe_utilisateur_nom();
				}
			}

			vueDest.setUtilisateurId(utilisateur.getutilisateur_p_id());
			vueDest.setEmployeId(employe.getemploye_p_id());
			vueDest.AddDataToFields( utilisateur.getUtilisateur_nom(), employe.getEmploye_nom(), employe.getEmploye_prenom(), employe.getEmploye_commentaire(), tableGroupeUtil, selectedGroupeUtil, utilisateur.getUtilisateur_actif()); 
		}
	};
}
