package client.control.admin;

import client.Application;
import client.ApplicationHelper;
import client.model.LienUserGroupRole;
import client.model.user.Droits;
import client.model.user.Role;
import client.view.accueil.PanelAccueil;
import client.view.admin.gestionUser.PanelAssignerUser;
import client.view.admin.gestionUser.PanelGestionUser;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import client.view.role.PanelCreerRole;

/**
 * <u><b>Explication générale de la classe :</b></u>
 * <P>
 * Cette classe permet de gérer l'évènement lié au bouton de la création de rôle
 * 
 * @author Dream Team - ING2
 */
public class EcouteurCreerRole implements ActionListener {

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

	public EcouteurCreerRole() {}

	/**
	 * <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) {

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

			// On récupère le nom de l'utilisateur et du groupe
			String nomUser = PanelGestionUser.getInstance().getUserBox()
					.getSelectedItem().toString();
			String nomGroup = PanelAssignerUser.getInstance().getGroupBox()
					.getSelectedItem().toString();

			// ID très utiles !
			int idUser = Application.getInstance().getIdUser(nomUser);
			int idRole = Application.getInstance().sizeOfArrayRole();
			int idGroup = Application.getInstance().getIdGroupe(nomGroup);

			int idOldRole = ApplicationHelper.IdRoleOfUserInGroup(idUser,
					idGroup);

			// On recupère le nom du Rôle
			String nomRole = PanelCreerRole.getInstance().getNomRole()
					.getText();

			// On crée le rôle
			Role role = new Role(nomRole);
			Application.getInstance().addRole(idRole, role);

			if (PanelCreerRole.getInstance().getAccepterMember().isSelected()) {
				role.addRight(Droits.ACCEPTER_MEMBRE);
			}

			if (PanelCreerRole.getInstance().getRefuserMember().isSelected()) {
				role.addRight(Droits.REFUSER_MEMBRE);
			}

			if (PanelCreerRole.getInstance().getAccepterMemberGroup()
					.isSelected()) {
				role.addRight(Droits.ACCEPTER_MEMBRE_GROUPE);
			}

			if (PanelCreerRole.getInstance().getRefuserMemberGroup()
					.isSelected()) {
				role.addRight(Droits.REFUSER_MEMBRE_GROUPE);
			}

			if (PanelCreerRole.getInstance().getSupprimerPb().isSelected()) {
				role.addRight(Droits.SUPPRIMER_PROBLEME);
			}

			if (PanelCreerRole.getInstance().getAssignerRole().isSelected()) {
				role.addRight(Droits.ASSIGNER_ROLE);
			}

			if (PanelCreerRole.getInstance().getConsulterPb().isSelected()) {
				role.addRight(Droits.CONSULTER_PROBLEME);
			}

			if (PanelCreerRole.getInstance().getCreerMembre().isSelected()) {
				role.addRight(Droits.CREER_MEMBRE);
			}

			if (PanelCreerRole.getInstance().getCreerGroup().isSelected()) {
				role.addRight(Droits.CREER_GROUPE);
			}

			if (PanelCreerRole.getInstance().getCreerPb().isSelected()) {
				role.addRight(Droits.CREER_PROBLEME);
			}

			if (PanelCreerRole.getInstance().getExclureMember().isSelected()) {
				role.addRight(Droits.EXCLURE_MEMBRE);
			}

			if (PanelCreerRole.getInstance().getExclureMemberGroup()
					.isSelected()) {
				role.addRight(Droits.EXCLURE_MEMBRE_GROUPE);
			}

			if (PanelCreerRole.getInstance().getModifierGroup().isSelected()) {
				role.addRight(Droits.MODIFIER_GROUPE);
			}

			if (PanelCreerRole.getInstance().getModifierMembre().isSelected()) {
				role.addRight(Droits.MODIFIER_MEMBRE);
			}

			if (PanelCreerRole.getInstance().getModifierPb().isSelected()) {
				role.addRight(Droits.MODIFIER_PROBLEME);
			}

			if (PanelCreerRole.getInstance().getRejoindreGroup().isSelected()) {
				role.addRight(Droits.REJOINDRE_GROUPE);
			}

			if (PanelCreerRole.getInstance().getQuitterGroup().isSelected()) {
				role.addRight(Droits.QUITTER_GROUPE);
			}

			if (PanelCreerRole.getInstance().getSupprimerGroup().isSelected()) {
				role.addRight(Droits.SUPPRIMER_GROUPE);
			}

			if (PanelCreerRole.getInstance().getSupprimerMember().isSelected()) {
				role.addRight(Droits.SUPPRIMER_MEMBRE);
			}

			if (PanelCreerRole.getInstance().getSupprimerPb().isSelected()) {
				role.addRight(Droits.SUPPRIMER_PROBLEME);
			}

			// ID du nouveau rôle = la taille de l'array !
			int idNewRole = Application.getInstance().sizeOfArrayRole();

			// Si l'user n'est pas dans le groupe
			if (!ApplicationHelper.UserIsInGroup(idUser, idGroup)) {

				// On ajoute dans l'arrayLink le nouveau membre avec son rôle
				Application.getInstance().getArrayLinkOfUserGroupRole().add(
						new LienUserGroupRole(idUser, idGroup, idNewRole));

			} else {
				// On met à jour l'arrayLink
				ApplicationHelper.ChangeRole(idRole, idGroup, idOldRole,
						idNewRole);
			}

			if (ApplicationHelper.UserHaveRightOfAdmin(role)) {
				System.out.println("User have a admin's right");
				Application.getInstance().getUser(idUser).setRolePersonne(role);
			}

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

			// TODO un p'tit coup de réseau pour mettre à jour le rôle du membre
			// dans son groupe
			throw new UnsupportedOperationException(
					"Méthode createRole non encore implémenté");
		}
	}
}
