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.group.Groupe;
import client.model.user.Role;
import client.view.PanelGenerale;
import client.view.accueil.PanelAccueil;
import client.view.admin.PanelAdmin;
import client.view.admin.gestionGroup.PanelCreerGroupe;
import client.view.admin.gestionGroup.PanelModifierGroupe;
import client.view.onglet.OngletSpecial;
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 modifier un groupe
 * 
 * @author Dream Team - ING2
 */
public class EcouteurModifierGroupe implements ActionListener {

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

    public EcouteurModifierGroupe() {}

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

            if (PanelAdmin.getInstance().getPmg().getUserBox().getSelectedIndex() != 0
                    && !PanelModifierGroupe.getInstance().getNomGroupe().getText().isEmpty()) {

                String nomOldGroup = PanelAdmin.getInstance().getPmg().getAncienGroupe();

                int idUser = Application.getInstance().getIdUser(PanelAdmin.getInstance().getPmg().getUserBox().getSelectedItem().toString().toLowerCase());
                int idGroup = Application.getInstance().getIdGroupe(PanelAdmin.getInstance().getPmg().getAncienGroupe());
                int idOldRole = ApplicationHelper.IdRoleOfUserInGroup(idUser, idGroup);

                String nomNouvGroupe = PanelAdmin.getInstance().getPmg().getNomGroupe().getText();

                if(nomNouvGroupe.length() > 0){             	
            		
            		Groupe newGroup = new Groupe();
            		newGroup.setIdGroupe(idGroup);
            		newGroup.setNomGroupe(nomNouvGroupe);
            		newGroup.setResponsableGroupe(Application.getInstance().getUser(PanelCreerGroupe.getInstance().getNomBox().getSelectedItem().toString()));

                	try{
                		
                		//On recupère le réseau
                		IDatabaseOperationsProxyFacade dao = OptimEISTIServerProxyFacade.getInstance();
                		
                		//TODO Update gênant car on perd les rôles ! de même pour tt les updates ! On doit alors récupérer les users de ces groupes !
                		//On crée le groupe modifié
                		newGroup = dao.updateGroup(Application.idSelect, idGroup, newGroup);
                		
                		//On ajoute le groupe dans le cache
                		Application.getInstance().addGroup(newGroup.getIdGroupe(), newGroup);
	
	                    //On change le responsable en membre
	                    ApplicationHelper.ChangeRole(ApplicationHelper.idUserOfRoleInGroup(idGroup, Role.IDRESPONSABLE), idGroup, Role.IDRESPONSABLE, idOldRole);
	
	                    //On change le membre en responsable
	                    ApplicationHelper.ChangeRole(idUser, idGroup, idOldRole, Role.IDRESPONSABLE);
	
	                    //On MAJ les activités récentes
	                    Application.getInstance().getUser(Application.idSelect).addActivity("Modification du groupe "+nomNouvGroupe+" ("+nomOldGroup+")");
	                    PanelAccueil.getInstance().getListOfActivite().setListData(Application.getInstance().getUser(Application.idSelect).displayActivities());
	                    PanelAccueil.getInstance().updateUI();
	                    
	                    //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(nomOldGroup)){
	                            	PanelGenerale.getInstance().getVueOnglet().remove(i);
	                            	
	                                PanelRespoGroupe rg = new PanelRespoGroupe(nomNouvGroupe);
	                                PanelGenerale.getInstance().getVueOnglet().add(rg);
	                                PanelGenerale.getInstance().getVueOnglet().setTabComponentAt(PanelGenerale.getInstance().getVueOnglet().indexOfComponent(rg), new OngletSpecial(nomNouvGroupe, true));
	
	                                rg.getAccueil().getPanGroup().remplirUserBoxRespoGroupe();
	                                
	                                rg.getAccueil().getPanInfosRespoGroup().remplirListOfActivities(Application.getInstance().getTabActivities(nomNouvGroupe));
	                                
	                            }
	                        }
	                    }
                	} catch (UnauthorizedOperationException ex) {
                    
                		JOptionPane.showMessageDialog(null,
                            ex.getLocalizedMessage(),
                            "Impossible de modifier un groupe : interdit pour vous !",
                            JOptionPane.ERROR_MESSAGE);
                	} catch (DataNotFoundException ed) {
                		JOptionPane.showMessageDialog(null,
                                ed.getLocalizedMessage(),
                                "Impossible de modifier un groupe : groupe non trouvé",
                                JOptionPane.ERROR_MESSAGE);
					}

                    System.out.print(Application.getInstance().toStringArrayLinkUserGroupRole());
                }else{
                    JOptionPane.showMessageDialog(PanelAdmin.getInstance(), "Erreur, veuillez entrer un nom de groupe", "Erreur", JOptionPane.ERROR_MESSAGE);
                }
            } else {
                JOptionPane.showMessageDialog(PanelAdmin.getInstance(), "Erreur, veuillez sélectionner un membre", "Erreur", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
}
