package client.control.admin;

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

import javax.swing.JOptionPane;

import reseau.DataNotFoundException;
import reseau.IDatabaseOperationsProxyFacade;
import reseau.IManagementOperationProxyFacade;
import reseau.OptimEISTIServerProxyFacade;
import reseau.UnauthorizedOperationException;

import client.Application;
import client.ApplicationHelper;
import client.model.group.Groupe;
import client.model.user.Droits;
import client.model.user.Role;
import client.view.accueil.PanelAccueil;
import client.view.admin.PanelAdmin;
import client.view.admin.gestionGroup.PanelModifierGroupe;
import client.view.admin.gestionUser.PanelGestionUser;

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

	public EcouteurSupprimerMembre() {}

	/**<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 récupère le rôle
		Role role = Application.getInstance().getUser(Application.idSelect)
				.getRolePersonne();
		// idRole du role en question
		int idRole = Application.getInstance().getIdRole(role);

		// On test si ce role possède le droit de modification de membre
		if (ApplicationHelper.ARoleCan(idRole, Droits.SUPPRIMER_MEMBRE)) {

			if (PanelGestionUser.getInstance().getUserBox().getSelectedIndex() != 0
					&& PanelGestionUser.getInstance().getUserBox()
							.getSelectedIndex() != Application.getInstance()
							.sizeOfArrayUser() + 1) {

				String nomUser = PanelGestionUser.getInstance().getUserBox()
						.getSelectedItem().toString();
				int idUser = Application.getInstance().getIdUser(nomUser);

				int option = JOptionPane
						.showConfirmDialog(PanelAdmin.getInstance(),
								"Êtes-vous sûr(e) de vouloir supprimer "
										+ nomUser + " ?",
								"Suppression d'un membre...",
								JOptionPane.YES_NO_OPTION,
								JOptionPane.QUESTION_MESSAGE);

				if (option != JOptionPane.NO_OPTION
						&& option != JOptionPane.CLOSED_OPTION) {

					if (ApplicationHelper.CanRemoveUser(idUser)) {

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

							// On supprime le membre concerné dans la BDD
							dao.deleteUser(Application.idSelect, idUser);

							// On modifie dans le cache
							Application.getInstance().removeUser(idUser);
							ApplicationHelper.RemoveUserFromArrayLink(idUser);

							// On met a jour les users
							try {
								// On recupère l'interface de management et on
								// met a jour les users
								IManagementOperationProxyFacade mop = OptimEISTIServerProxyFacade
										.getInstance();
								Application.getInstance().updateArrayGroup(
										mop.getGroups());

								for (Iterator<Groupe> g = Application
										.getInstance().getGroupes().iterator(); g
										.hasNext();)
									Application.getInstance().fillArrayUser(
											mop.getUsers(Application.idSelect,
													g.next().getIdGroupe()));
							} catch (DataNotFoundException ed) {
								JOptionPane
										.showMessageDialog(
												null,
												ed.getLocalizedMessage(),
												"Erreur : Impossible de mettre à jour les utilisateurs !",
												JOptionPane.ERROR_MESSAGE);
							} catch (UnauthorizedOperationException eu) {
								JOptionPane
										.showMessageDialog(
												null,
												eu.getLocalizedMessage(),
												"Erreur : Impossible de mettre à jour les utilisateurs : interdit pour vous !",
												JOptionPane.ERROR_MESSAGE);
							}

							// On MAJ les activités récentes
							Application.getInstance().getUser(
									Application.idSelect).addActivity(
									"Suppression de " + nomUser);
							PanelAccueil.getInstance().getListOfActivite()
									.setListData(
											Application.getInstance().getUser(
													Application.idSelect)
													.displayActivities());
							PanelAccueil.getInstance().updateUI();

							// MAJ des composants Box Gestion d'User
							int sizeOld = PanelGestionUser.getInstance()
									.getUserBox().getItemCount();
							PanelGestionUser.getInstance().remplirUserBox();
							PanelGestionUser.getInstance().deleteItemOfUserBox(
									sizeOld);
							PanelGestionUser.getInstance().updateUI();

							// MAJ des composants Box Gestion Groupe
							PanelModifierGroupe.getInstance()
									.remplirUserBoxRespoGroupe();
							PanelModifierGroupe.getInstance().updateUI();

						} catch (UnauthorizedOperationException ex) {

							JOptionPane
									.showMessageDialog(
											null,
											ex.getLocalizedMessage(),
											"Impossible de supprimer un groupe : interdit pour vous !",
											JOptionPane.ERROR_MESSAGE);
						} catch (DataNotFoundException ed) {

							JOptionPane
									.showMessageDialog(
											null,
											ed.getLocalizedMessage(),
											"Impossible de supprimer un groupe : groupe non trouvé !",
											JOptionPane.ERROR_MESSAGE);
						}
					} else {
						JOptionPane.showMessageDialog(PanelAdmin.getInstance(),
								"Erreur, Un groupe serait sans membre",
								"Erreur", JOptionPane.ERROR_MESSAGE);
					}
				}
			}
		} else {
			JOptionPane.showMessageDialog(PanelAdmin.getInstance(),
					"Vous n'avez pas les droits pour supprimer un membre",
					"Erreur", JOptionPane.ERROR_MESSAGE);
		}
	}
}
