package client.control;

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

import javax.swing.JOptionPane;

import reseau.DataNotFoundException;
import reseau.IManagementOperationProxyFacade;
import reseau.OptimEISTIServerProxyFacade;
import reseau.UnauthorizedOperationException;
import client.Application;
import client.ApplicationHelper;
import client.model.problem.Probleme;
import client.model.user.Role;
import client.view.PanelGenerale;
import client.view.accueil.PanelAccueil;
import client.view.member.PanelMembre;
import client.view.onglet.OngletSpecial;
import client.view.respoGroup.PanelRespoGroupe;

/**
 * <u><b>Explication générale de la classe :</b></u>
 * <P>
 * Cette classe permet d'ouvrir un onglet correspondant au groupe sélectionné
 * 
 * @author Dream Team
 */
public class EcouteurGoTo implements ActionListener {

	public EcouteurGoTo() {
	}

	/**
	 * <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 regarde si le groupe est le bon
		if (PanelAccueil.getInstance().getGroupAccueilBox().getSelectedIndex() != 0) {

			// nom du groupe sélectionné
			String nomGroupe = PanelAccueil.getInstance().getGroupAccueilBox()
					.getSelectedItem().toString();

			// id utiles
			int idUser = Application.idSelect;
			int idGroup = Application.getInstance().getIdGroupe(nomGroupe);

			if ((ApplicationHelper.UserHaveGoodRole(idUser, idGroup,
					Role.IDRESPONSABLE))
					|| (ApplicationHelper.UserHaveGoodRole(idUser, idGroup,
							Role.IDADMINISTRATEUR))
					|| (ApplicationHelper.UserHaveRightOfRespo(idUser, idGroup))) {

				// on crée l'onglet des responsables du groupe
				PanelRespoGroupe rg = new PanelRespoGroupe(nomGroupe);
				PanelGenerale.getInstance().getVueOnglet().add(rg);
				PanelGenerale.getInstance().getVueOnglet().setTabComponentAt(
						PanelGenerale.getInstance().getVueOnglet()
								.indexOfComponent(rg),
						new OngletSpecial(nomGroupe, true));
				PanelGenerale.getInstance().getVueOnglet().setSelectedIndex(
						PanelGenerale.getInstance().getVueOnglet()
								.indexOfComponent(rg));

				// On met à jour les users
				IManagementOperationProxyFacade mop = OptimEISTIServerProxyFacade
						.getInstance();

				try {
					Application.getInstance().updateArrayUser(
							mop.getUsers(Application.idSelect, idGroup));
				} catch (UnauthorizedOperationException ex) {
					JOptionPane
							.showMessageDialog(
									null,
									ex.getLocalizedMessage(),
									"Impossible de charger les utilisateurs : interdit pour vous !",
									JOptionPane.ERROR_MESSAGE);
				} catch (DataNotFoundException ed) {
					JOptionPane.showMessageDialog(null, ed
							.getLocalizedMessage(),
							"Erreur : Impossible de charger les utilisateurs",
							JOptionPane.ERROR_MESSAGE);
				}

				// On met à jour les problemes et resultats
				try {
					Application.getInstance().fillArrayProbleme(
							mop.getProblems(Application.idSelect, idGroup));
				} catch (UnauthorizedOperationException ex) {
					JOptionPane
							.showMessageDialog(
									null,
									ex.getLocalizedMessage(),
									"Impossible de charger les problèmes : interdit pour vous !",
									JOptionPane.ERROR_MESSAGE);
				} catch (DataNotFoundException ed) {
					JOptionPane.showMessageDialog(null, ed
							.getLocalizedMessage(),
							"Erreur : Impossible de charger les problèmes",
							JOptionPane.ERROR_MESSAGE);
				}

				for (Iterator<Probleme> i = Application.getInstance()
						.getProblemes().iterator(); i.hasNext();) {
					try {
						Application.getInstance().fillArrayResult(
								mop.getResults(Application.idSelect, idGroup, i
										.next().getIdProbleme()));
					} catch (UnauthorizedOperationException ex) {
						JOptionPane
								.showMessageDialog(
										null,
										ex.getLocalizedMessage(),
										"Impossible de charger les résultats : interdit pour vous !",
										JOptionPane.ERROR_MESSAGE);
					} catch (DataNotFoundException ed) {
						JOptionPane.showMessageDialog(null, ed
								.getLocalizedMessage(),
								"Erreur : Impossible de charger les résultats",
								JOptionPane.ERROR_MESSAGE);
					}
				}

				// On met à jour le panel de gestion des groupes
				rg.getAccueil().getPanGroup().remplirUserBoxRespoGroupe();

				// On met à jour le panel les dernières activités
				rg.getAccueil().getPanInfosRespoGroup()
						.remplirListOfActivities(
								Application.getInstance().getTabActivities(
										nomGroupe));

			} else {

				// On crée l'onglet des membres
				PanelMembre m = new PanelMembre(nomGroupe);
				PanelGenerale.getInstance().getVueOnglet().add(m);
				PanelGenerale.getInstance().getVueOnglet().setTabComponentAt(
						PanelGenerale.getInstance().getVueOnglet()
								.indexOfComponent(m),
						new OngletSpecial(nomGroupe, true));
				PanelGenerale.getInstance().getVueOnglet().setSelectedIndex(
						PanelGenerale.getInstance().getVueOnglet()
								.indexOfComponent(m));

				m.getAccueil().getPanMembre().remplirDeleteBoxGroupe();
				m.getAccueil().getPanMembre().remplirJoinBoxGroupe();

				m.getAccueil().getPanInfosMembre().remplirListOfActivities(
						Application.getInstance().getTabActivities(nomGroupe));
			}

		}
	}

}
