package client.control.admin;

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

import javax.swing.JOptionPane;

import reseau.DataNotFoundException;
import reseau.IDatabaseOperationsProxyFacade;
import reseau.OptimEISTIServerProxyFacade;
import reseau.UnauthorizedOperationException;
import client.Application;
import client.ApplicationHelper;
import client.model.LienUserGroupRole;
import client.model.user.Role;
import client.model.user.Utilisateur;
import client.view.admin.PanelAdmin;

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

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

	public EcouteurAssignation() {}

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

		// id User
		int idUser = PanelAdmin.getInstance().getPau().getMembreChoisi();
		System.out.println("idUser : " + idUser);

		// id Group
		int idGroup = Application.getInstance().getIdGroupe(
				PanelAdmin.getInstance().getPau().getGroupBox()
						.getSelectedItem().toString());
		System.out.println("Groupe id: "
				+ (Application.getInstance().getIdGroupe(PanelAdmin
						.getInstance().getPau().getGroupBox().getSelectedItem()
						.toString())));

		// id Role
		int idOldRole = ApplicationHelper.IdRoleOfUserInGroup(idUser, idGroup);
		System.out.println("Old Role id : " + idOldRole);

		// ID NewRole
		int idNewRole = Application.getInstance().getIdRole(
				PanelAdmin.getInstance().getPau().getGroupGURole()
						.getSelection().getActionCommand());
		System.out.println("New Role id : " + idNewRole);

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

			Utilisateur newUser = new Utilisateur();
			newUser.setIdPersonne(idUser);
			newUser.setLogin(Application.getInstance().getUser(idUser)
					.getLogin());
			newUser.setPassword(Application.getInstance().getUser(idUser)
					.getPassword());

			// Si on a un admin
			if (PanelAdmin.getInstance().getPau().getAdminButton().isSelected()) {

				// On change l'admin
				int idOldAdmin = Application.getInstance().getIdAdmin();
				ApplicationHelper.ChangeAdmin(idUser, idOldAdmin);

				// On trie par IdUser
				Application.getInstance().sortByIdUserArrayLink();

				// Si on a un responsable ou un membre
			} else if (PanelAdmin.getInstance().getPau().getMembreButton()
					.isSelected()
					|| PanelAdmin.getInstance().getPau().getRespoButton()
							.isSelected()) {

				// Si l'user n'est pas dans le groupe
				if (!ApplicationHelper.UserIsInGroup(idUser, idGroup)) {
					if (idNewRole == Role.IDRESPONSABLE) {
						// On change le responsable en membre
						ApplicationHelper.ChangeRole(ApplicationHelper
								.idUserOfRoleInGroup(idGroup, idNewRole),
								idGroup, idNewRole, Role.IDMEMBRE);
					}

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

				} else {

					// On change le responsable en membre
					ApplicationHelper.ChangeRole(ApplicationHelper
							.idUserOfRoleInGroup(idGroup, idNewRole), idGroup,
							idNewRole, idOldRole);

					// On change le membre en responsable
					ApplicationHelper.ChangeRole(idUser, idGroup, idOldRole,
							idNewRole);

				}
			}

			try {
				// On récupère le réseau
				IDatabaseOperationsProxyFacade dao = OptimEISTIServerProxyFacade
						.getInstance();
				newUser = dao
						.updateUser(Application.idSelect, idGroup, newUser);
				Application.getInstance().addUser(newUser.getIdPersonne(),
						newUser);
			} 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);
			}

			System.out.print(Application.getInstance()
					.toStringArrayLinkUserGroupRole());
		}
	}
}
