package client.control.connexion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Map;

import javax.swing.JOptionPane;

import reseau.DataNotFoundException;
import reseau.OptimEISTIServerProxyFacade;
import reseau.UnauthorizedOperationException;
import client.Application;
import client.ApplicationHelper;
import client.model.group.Groupe;
import client.model.user.Role;
import client.model.user.Utilisateur;
import client.view.PanelGenerale;
import client.view.accueil.PanelAccueil;
import client.view.admin.PanelAdmin;
import client.view.connexion.Fenetre;
import client.view.connexion.PanelConnexion;
import client.view.onglet.OngletSpecial;

/**<u><b>Explication générale de la classe :</b></u>
 * <P> Cette classe permet de gérer l'évènement lié au bouton valider lors de la connexion
 *
 * @author Dream Team - ING2
 */
public class EcouteurLoginValider implements ActionListener {

    public EcouteurLoginValider() {}

    /**<u><i>Explication générale de la méthode :</i></u>
     * <P> Cette méthode permet de gérer les évènements liés à la souris
     * 
     * @param e Evènement souris
     * 
     */
    public void actionPerformed(ActionEvent e) {

    	//On recupère le login et le password
        String login = PanelConnexion.getInstance().getLoginText().getText();
        String password = new String(PanelConnexion.getInstance().getPasswordText().getPassword());

        try {
        	
        	//On recupère le réseau
            OptimEISTIServerProxyFacade dao = OptimEISTIServerProxyFacade.getInstance();

            Application.getInstance().updateArrayGroup(dao.getGroups());
            
            //Tentative de connection
            Utilisateur user = dao.authentify(login, password);
            Application.idSelect = user.getIdPersonne();

            //On envoie un message XML pour chacun des groupes afin de récupérer les infos concernants ces derniers.
            Map<Integer, Groupe> mapGr = ApplicationHelper.GroupsOfUser(Application.idSelect);

            for (Iterator<Integer> iteratorGroup = mapGr.keySet().iterator(); iteratorGroup.hasNext();) {

                int iteratorGetGr = iteratorGroup.next();

                Application.getInstance().updateArrayProbleme(dao.getProblems(Application.idSelect, iteratorGetGr));

                for (Iterator<Integer> iteratorPb = Application.getInstance().getGroupe(iteratorGetGr).getVectProbleme().iterator(); iteratorPb.hasNext();) {

                    int iterartorGetPb = iteratorPb.next();

                    Application.getInstance().updateArrayResult(dao.getResults(Application.idSelect, iteratorGetGr, iterartorGetPb));
                }
                
                Application.getInstance().updateArrayUser(dao.getUsers(Application.idSelect, iteratorGetGr));

            }

            Fenetre.getInstance().setTitle("OPTIM'EISTI");

            //On supprime les champs entrés
            PanelConnexion.getInstance().getLoginText().setText("");
            PanelConnexion.getInstance().getPasswordText().setText("");

            System.out.println("IdUser en cours : " + Application.idSelect);

            //Panel pour créer l'ensemble des onglets du logiciel
            PanelGenerale general = PanelGenerale.getInstance();
            general.setLayout(null);
            general.setBounds(0, 0, 900, 550);
            general.setVisible(false);
            Fenetre.getInstance().add(general);

            //Panel de l'accueil
            PanelAccueil ai = PanelAccueil.getInstance();

            //On met les groupes de l'user
            ai.remplirGroupeBox();

            //On ajoute un onglet pour ce panel
            general.getVueOnglet().add(ai);
            general.getVueOnglet().setTabComponentAt(general.getVueOnglet().indexOfComponent(ai), new OngletSpecial("Accueil", false));
            general.getVueOnglet().setSelectedIndex(0);

            //On crée le rôle de l'administrateur
            Role roleAdmin = new Role(Role.ADMINISTRATEUR);
            Application.getInstance().addRole(Role.IDADMINISTRATEUR, roleAdmin);

            //On crée le rôle du responsable
            Role roleRespo = new Role(Role.RESPONSABLE);
            Application.getInstance().addRole(Role.IDRESPONSABLE, roleRespo);

            //On crée le rôle du membre
            Role roleMembre = new Role(Role.MEMBRE);
            Application.getInstance().addRole(Role.IDMEMBRE, roleMembre);
            
            //TODO à modifier en fonction du role et non de l'id...
            //Si on a un admin alors on lui met l'onglet administrateur
            if (Application.idSelect == Role.IDADMINISTRATEUR) {
                PanelAdmin ad = PanelAdmin.getInstance();
                general.getVueOnglet().add(ad);
                general.getVueOnglet().setTabComponentAt(general.getVueOnglet().indexOfComponent(ad), new OngletSpecial("Administrateur", false));

                //On ajoute le role Admin
                Application.getInstance().getUser(Application.idSelect).setRolePersonne(roleAdmin);
            }

        } catch (UnauthorizedOperationException ex) {
            JOptionPane.showMessageDialog(null,
                    ex.getLocalizedMessage(),
                    "Impossible de se connecter : mauvais login ou/et password !",
                    JOptionPane.ERROR_MESSAGE);
        } catch (DataNotFoundException ed) {
            JOptionPane.showMessageDialog(null,
                    ed.getLocalizedMessage(),
                    "Impossible de se connecter : le chargement a connu des erreurs !",
                    JOptionPane.ERROR_MESSAGE);
        }
    }
}
