package client.control.admin;

import client.Application;
import client.ApplicationHelper;
import client.model.LienUserGroupRole;
import client.model.group.Groupe;
import client.model.user.Role;
import client.view.accueil.PanelAccueil;
import client.view.admin.PanelAdmin;
import client.view.admin.gestionGroup.PanelCreerGroupe;
import reseau.IDatabaseOperationsProxyFacade;
import reseau.IManagementOperationProxyFacade;
import reseau.OptimEISTIServerProxyFacade;
import reseau.UnauthorizedOperationException;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;

/**<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 groupe
 *
 * @author Dream Team - ING2
 */
public class EcouteurCreerGroupe implements ActionListener {

	//logger
    private static final Logger logger = Logger.getLogger(EcouteurCreerGroupe.class.getCanonicalName());

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

    public EcouteurCreerGroupe() {}

    /**<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 test si on peut bien créer le groupe
            if(PanelCreerGroupe.getInstance().getNomBox().getSelectedIndex() != 0 &&
                    !PanelCreerGroupe.getInstance().getNomGroupe().getText().isEmpty()){
                //On recupère le nom du groupe
                String nomGroupe = PanelAdmin.getInstance().getPcg().getNomGroupe().getText();
                
                //On recupère l'interface de management et on met a jour les groupes
            	IManagementOperationProxyFacade mop = OptimEISTIServerProxyFacade.getInstance();
            	Application.getInstance().updateArrayGroup(mop.getGroups());
                
                int idGroupe = Application.getInstance().getIdGroupe(nomGroupe);

                //FIXME Au serveur de te le dire...
                if(idGroupe == -1){
	                int idAssignedResponsable = Application.getInstance().getIdUser(
                            PanelAdmin.getInstance().getPcg().getNomBox().getSelectedItem().toString());
	                int idRole = Role.IDRESPONSABLE;

	                //On crée un nouveau groupe
	                Groupe newGroup = new Groupe();
	                newGroup.setNomGroupe(nomGroupe);
	                newGroup.setResponsableGroupe(Application.getInstance().getUser(PanelCreerGroupe.getInstance().getNomBox().getSelectedItem().toString()));

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

                        //Creation du groupe
                        newGroup = dao.createGroup(Application.idSelect, newGroup);

                        //Ajout du nouveau groupe dans le cache de l'application
                        Application.getInstance().addGroup(newGroup.getIdGroupe(), newGroup);

                        //FIXME On considère l'admin comme étant dans un role dans un groupe ou non
                        if (ApplicationHelper.IdRoleOfUserInGroup(idAssignedResponsable, newGroup.getIdGroupe() - 1)
                                != Role.IDADMINISTRATEUR) {
                            //On ajoute le nouveau lien dans l'arrayLink avec le respo et le groupe
                            Application.getInstance().getArrayLinkOfUserGroupRole().add(
                                    new LienUserGroupRole(idAssignedResponsable, newGroup.getIdGroupe(), idRole));
                        } else {
                            //On ajoute le nouveau lien dans l'arrayLink de l'admin
                            Application.getInstance().getArrayLinkOfUserGroupRole().add(
                                    new LienUserGroupRole(Role.IDADMINISTRATEUR, newGroup.getIdGroupe(), Role.IDADMINISTRATEUR));
                        }

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

                        logger.info("idGroup : "+newGroup.getIdGroupe());
                        logger.info("link : "+Application.getInstance().toStringArrayLinkUserGroupRole());

                        JOptionPane.showMessageDialog(null,
                                "Groupe créé avec succès !",
                                "Création de groupe",
                                JOptionPane.INFORMATION_MESSAGE);
                    } catch (UnauthorizedOperationException ex) {
                        logger.log(Level.SEVERE,"Action not allowed",ex);
                        JOptionPane.showMessageDialog(null,
                                ex.getLocalizedMessage(),
                                "Impossible de créer un groupe",
                                JOptionPane.ERROR_MESSAGE);
                    }

	                
                }else{
                	JOptionPane.showMessageDialog(PanelAdmin.getInstance(), "Erreur, ce groupe existe déjà","Erreur",JOptionPane.ERROR_MESSAGE);
                }
                
            }else{
            	JOptionPane.showMessageDialog(PanelAdmin.getInstance(), "Erreur, Mauvaise sélection et/ou champ vide","Erreur",JOptionPane.ERROR_MESSAGE);
            }

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