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.model.LienUserGroupRole;
import client.model.group.Groupe;
import client.model.user.Role;
import client.model.user.Utilisateur;
import client.view.PanelGenerale;
import client.view.accueil.PanelAccueil;
import client.view.admin.PanelAdmin;
import client.view.admin.gestionGroup.PanelCreerGroupe;
import client.view.admin.gestionUser.PanelCreerUser;
import client.view.admin.gestionUser.PanelGestionUser;
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 créer un membre
 * 
 * @author Dream Team - ING2
 */
public class EcouteurCreerMembre implements ActionListener {

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

	public EcouteurCreerMembre() {}

	/**
	 * <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 recupère le login et le password ainsi que le groupe
			// sélectionné
			String login = PanelCreerUser.getInstance().getLogin().getText();
			String pass = PanelCreerUser.getInstance().getPassword().getText();
			String nomGroupe = PanelAdmin.getInstance().getPcu().getGroupBox()
					.getSelectedItem().toString();

			if ((login.length() > 0)
					&& (pass.length() > 0)
					&& (PanelCreerUser.getInstance().getGroupBox()
							.getSelectedIndex() != 0)) {

				// On recupère les id
				int idGroup = Application.getInstance().getIdGroupe(nomGroupe);
				int idRole = Role.IDMEMBRE;

				String loginText = PanelAdmin.getInstance().getPcu().getLogin()
						.getText();
				String passwordText = PanelAdmin.getInstance().getPcu()
						.getPassword().getText();

				// On crée le nouvel utilisateur
				Utilisateur newUser = new Utilisateur();

				newUser.setLogin(loginText);
				newUser.setPassword(passwordText);

				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);
				}

				try {
					// On recupère une instance de réseau
					IDatabaseOperationsProxyFacade dao = OptimEISTIServerProxyFacade
							.getInstance();

					// On crée l'utilisateur
					newUser = dao.createUser(Application.idSelect, newUser);

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

					// On ajoute dans l'arrayLink
					Application.getInstance().getArrayLinkOfUserGroupRole()
							.add(
									new LienUserGroupRole(newUser
											.getIdPersonne(), idGroup, idRole));

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

					// On MAJ les combo box des membres
					int size = PanelGestionUser.getInstance().getUserBox()
							.getItemCount();
					PanelGestionUser.getInstance().remplirUserBox();
					PanelGestionUser.getInstance().deleteItemOfUserBox(size);
				} catch (UnauthorizedOperationException ex) {
					JOptionPane
							.showMessageDialog(
									null,
									ex.getLocalizedMessage(),
									"Impossible de créer un utilisateur : interdit pour vous !",
									JOptionPane.ERROR_MESSAGE);
				}

				// On MAJ les combo box du groupe
				PanelCreerGroupe.getInstance().remplirUser();

				// On MAJ si on a des onglets respo groupe déjà ouvert
				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);
						if (prg.getAccueil().getNomGroupe().equals(nomGroupe)) {
							prg.getAccueil().getPanGroup()
									.remplirUserBoxRespoGroupe();
							prg.getAccueil().getPanGroup().updateUI();
						}
					}
				}

				JOptionPane.showMessageDialog(PanelAdmin.getInstance(),
						"Inscription validée", "Confirmation d'inscription",
						JOptionPane.INFORMATION_MESSAGE);

			} else {
				JOptionPane
						.showMessageDialog(
								null,
								"Vous n'avez pas bien rempli les champs Nom/Login/Password",
								"Erreur", JOptionPane.ERROR_MESSAGE);
			}

		} else if (e.getActionCommand().equals(ANNULER)) {
			PanelAdmin.getInstance().getPcu().setVisible(false);
		}
	}

}
