package client.control.admin;

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

import client.Application;
import client.ApplicationHelper;
import client.model.LienUserGroupRole;
import client.model.group.Groupe;
import client.model.user.Droits;
import client.model.user.Role;
import client.model.user.Utilisateur;
import client.view.PanelGenerale;
import client.view.accueil.PanelAccueil;
import client.view.admin.gestionGroup.PanelCreerGroupe;
import client.view.admin.gestionGroup.PanelGestionGroupe;
import client.view.respoGroup.PanelRespoGroupe;

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

	// Variables permettant de définir les ActionCommand
	public static final String ACCEPTER = "ACCEPTER";
	public static final String REFUSER = "REFUSER";

	public EcouteurMembreAttente() {}

	/**
	 * <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 l'utilisateur
		String nomUser = PanelGestionGroupe.getInstance().getUserPendingBox()
				.getSelectedItem().toString();
		Utilisateur user = Application.getInstance().getUserPending(nomUser);

		if (e.getActionCommand().equals(ACCEPTER)) {

			if (PanelGestionGroupe.getInstance().getUserPendingBox()
					.getSelectedIndex() != 0) {

				//On recupè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 d'assigner un role
				if (ApplicationHelper.ARoleCan(idRole, Droits.ACCEPTER_MEMBRE)) {

					// On recupère les id
					int newIdUser = Application.getInstance().sizeOfArrayUser();
					int oldIdUser = user.getIdPersonne();
					int idRoleNouvUser = Role.IDMEMBRE;

					// on change l'id pending user en id arrayUser
					user.setIdPersonne(newIdUser);

					// On ajoute le user à l'arrayList
					Application.getInstance().addUser(newIdUser, user);

					// On ajoute dans l'arrayLink
					for (Iterator<Groupe> i = user.getVectGroupe().iterator(); i
							.hasNext();) {
						Application.getInstance().getArrayLinkOfUserGroupRole()
								.add(
										new LienUserGroupRole(newIdUser, i
												.next().getIdGroupe(),
												idRoleNouvUser));
					}

					Application.getInstance().removeUserPending(oldIdUser);

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

					PanelCreerGroupe.getInstance().remplirUser();
					PanelCreerGroupe.getInstance().updateUI();

					for (int i = 0; i < PanelGenerale.getInstance()
							.getVueOnglet().getTabCount(); i++) {

						if (PanelGenerale.getInstance().getVueOnglet()
								.getComponentAt(i) instanceof PanelRespoGroupe) {
							PanelRespoGroupe prg = (PanelRespoGroupe) PanelGenerale
									.getInstance().getVueOnglet()
									.getComponentAt(i);
							prg.getAccueil().getPanGroup()
									.remplirUserBoxRespoGroupe();
							prg.getAccueil().getPanGroup()
									.remplirUserPendingBox();
							prg.getAccueil().getPanGroup().updateUI();
						}
					}
					throw new UnsupportedOperationException(
							"Méthode acceptUser non encore implémenté");
				}
			}

		} else if (e.getActionCommand().equals(REFUSER)) {
			Role role = Application.getInstance().getUser(Application.idSelect)
					.getRolePersonne();

			// Si on a un role ayant au moins un droit de l'admin, on aura un
			// role différent de nul
			if (role != null) {

				// idRole du role en question
				int idRole = Application.getInstance().getIdRole(role);

				System.out.println("idRole : " + idRole);
				// On test si ce role possède le droit d'assigner un role
				if (ApplicationHelper.ARoleCan(idRole, Droits.REFUSER_MEMBRE)) {
					Application.getInstance().removeUserPending(
							user.getIdPersonne());
				}
			}
		}
	}

}
