package client.control.probleme;

import java.awt.Component;
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.user.Droits;
import client.view.accueil.PanelAccueil;
import client.view.member.PanelMembre;
import client.view.respoGroup.PanelRespoGroupe;

/** <u><b>Explication générale de la classe :</b></u>
 * <P> Cette classe permet de créer le controleur instancié dans PanelProbleme du bouton Supprimer
 *
 * @author Dream Team - ING2
 */
public class ControleurBoutonSupprimerProbleme implements ActionListener {

    /**<u><i>Explication générale du constructeur :</i></u>
     * <P> Constructeur de la classe permettant de créer le Controleur du bouton Supprimer Problème et de récuperer le Panel Problème
     *
     */
    public ControleurBoutonSupprimerProbleme() {}

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode est l'écouteur du bouton Supprimer. Il supprimer un problème
     * en fonction de celui qu'il a selectionné dans la JComboBox.
     *
     */
    public void actionPerformed(ActionEvent e) {

        Component c = (Component) e.getSource();

        PanelRespoGroupe prg = null;
        PanelMembre pm = null;

        while (c != null) {
            if (c instanceof PanelRespoGroupe) {
                prg = (PanelRespoGroupe) c;
            } else if (c instanceof PanelMembre) {
                pm = (PanelMembre) c;
            }
            c = c.getParent();
        }

        //On recupère l'idGroup en fonction du user
        int idGroup;
        String nomGroupe = new String();

        if(prg !=null){
            idGroup = Application.getInstance().getIdGroupe(prg.getAccueil().getNomGroupe());
            nomGroupe = prg.getAccueil().getNomGroupe();
        }else{
            idGroup = Application.getInstance().getIdGroupe(pm.getAccueil().getNomGroupe());
            nomGroupe = pm.getAccueil().getNomGroupe();
        }
        
        //On test si ce role possède le droit de modification de problème
        if (ApplicationHelper.ARoleCanInGroup(Application.idSelect, idGroup, Droits.SUPPRIMER_PROBLEME)) {

            if (prg != null) {

                int option = JOptionPane.showConfirmDialog(null, "Voulez-vous supprimer le problème ?", "Suppression", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

                if (option != JOptionPane.NO_OPTION && option != JOptionPane.CLOSED_OPTION) {
                	
                	String nomProbleme = prg.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem().toString();
                	
                    prg.getProbleme().getPanChoixPb().getProblemeBox().removeItem(prg.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem());
                    prg.getProbleme().getPanModifPb().setVisible(false);
                    prg.getProbleme().getPanConsultPb().setVisible(false);
                    prg.getProbleme().getPanExecPb().setVisible(false);
                    prg.getProbleme().getPanExecPb().ViderPanelCondiMethode();
                    prg.getProbleme().getPanExecPb().CacherLabel();
                    prg.getProbleme().getPanExecPb().getMethodes().setSelectedIndex(0);
                    
                    int idProblem = Application.getInstance().getIdProbleme(nomProbleme);
                    
                    try{
                    	
                    	//On récupère le réseau
						IDatabaseOperationsProxyFacade dao = OptimEISTIServerProxyFacade.getInstance();
						
						//Problème supprimé
						dao.deleteProblem(Application.idSelect, idGroup, idProblem);
                    	
	                    // On supprime le problème dans le groupe et inversement
						Application.getInstance().getGroupe(nomGroupe).removeIdProbleme(idProblem);
						Application.getInstance().getProbleme(idProblem).setIdGroup(-1);
	                    
	                    //On supprime le problème dans l'arrayProbleme
	                    Application.getInstance().removeProbleme(idProblem);
	                    
	                    //TODO Mettre à jour avec le réseau la liste des problèmes
	                    
	                    //On supprime le problème dans l'arrayProblemeMethodeResultat
	                    ApplicationHelper.RemoveProblemeFromArrayLink(idProblem);
	                    
	                    //On MAJ les activités récentes
	                    Application.getInstance().getGroupe(nomGroupe).addActivity("Problème " +nomProbleme+ " supprimé");
	                    prg.getAccueil().getPanInfosRespoGroup().getListOfActivite().setListData(Application.getInstance().getGroupe(nomGroupe).displayActivities());
	                    prg.getAccueil().getPanInfosRespoGroup().updateUI();
	                    
	                    //On MAJ les activités récentes
	                    Application.getInstance().getUser(Application.idSelect).addActivity("Problème " +nomProbleme+ " supprimé");
	                    PanelAccueil.getInstance().getListOfActivite().setListData(Application.getInstance().getUser(Application.idSelect).displayActivities());
	                    PanelAccueil.getInstance().updateUI();
	                    
	                    //On MAJ les box des problèmes
	                    int size = prg.getProbleme().getPanChoixPb().getProblemeBox().getItemCount();
	                    prg.getProbleme().getPanChoixPb().remplirProblemeBox();
	                    prg.getProbleme().getPanChoixPb().deleteItemOfGroupBox(size);
	                    prg.getProbleme().getPanChoixPb().updateUI();
	                    
	                    prg.getBenchmark().getPanBenchmarkPb().remplirProblemeBox();
	                    prg.getBenchmark().getPanBenchmarkPb().updateUI();
	                    
                    } catch (UnauthorizedOperationException ex) {
                    	JOptionPane.showMessageDialog(null,
                                ex.getLocalizedMessage(),
                                "Impossible de supprimer ce problème : interdit pour vous !",
                                JOptionPane.ERROR_MESSAGE);
                    } catch (DataNotFoundException ed) {
                    	JOptionPane.showMessageDialog(null,
                                ed.getLocalizedMessage(),
                                "Impossible de supprimer ce problème : problème non troubé !",
                                JOptionPane.ERROR_MESSAGE);
					}

                }
            }else if (pm != null) {

                int option = JOptionPane.showConfirmDialog(null, "Voulez-vous supprimer le problème ?", "Suppression", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

                if (option != JOptionPane.NO_OPTION && option != JOptionPane.CLOSED_OPTION) {
                	
                    String nomProbleme = pm.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem().toString();
                	
                    pm.getProbleme().getPanChoixPb().getProblemeBox().removeItem(pm.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem());
                    pm.getProbleme().getPanModifPb().setVisible(false);
                    pm.getProbleme().getPanConsultPb().setVisible(false);
                    pm.getProbleme().getPanExecPb().setVisible(false);
                    pm.getProbleme().getPanExecPb().ViderPanelCondiMethode();
                    pm.getProbleme().getPanExecPb().CacherLabel();
                    pm.getProbleme().getPanExecPb().getMethodes().setSelectedIndex(0);
                    
                    int idProblem = Application.getInstance().getIdProbleme(nomProbleme);
                    
                    try{
                    	
                    	//On récupère le réseau
						IDatabaseOperationsProxyFacade dao = OptimEISTIServerProxyFacade.getInstance();
						
						//Problème supprimé
						dao.deleteProblem(Application.idSelect, idGroup, idProblem);
                    	
	                    // On supprime le problème dans le groupe et inversement
						Application.getInstance().getGroupe(nomGroupe).removeIdProbleme(idProblem);
						Application.getInstance().getProbleme(idProblem).setIdGroup(-1);
	                    
	                    //On supprime le problème dans l'arrayProbleme
	                    Application.getInstance().removeProbleme(idProblem);
	                    
	                    //On supprime le problème dans l'arrayProblemeMethodeResultat
	                    ApplicationHelper.RemoveProblemeFromArrayLink(idProblem);
	                    
	                    //On MAJ les activités récentes
	                    Application.getInstance().getGroupe(nomGroupe).addActivity("Problème " +nomProbleme+ " supprimè");
	                    pm.getAccueil().getPanInfosMembre().getListOfActivite().setListData(Application.getInstance().getGroupe(nomGroupe).displayActivities());
	                    pm.getAccueil().getPanInfosMembre().updateUI();
	                    
	                    //On MAJ les activités récentes
	                    Application.getInstance().getUser(Application.idSelect).addActivity("Problème " +nomProbleme+ " supprimè");
	                    PanelAccueil.getInstance().getListOfActivite().setListData(Application.getInstance().getUser(Application.idSelect).displayActivities());
	                    PanelAccueil.getInstance().updateUI();
	                    
	                    //On MAJ les box des problèmes
	                    int size = pm.getProbleme().getPanChoixPb().getProblemeBox().getItemCount();
	                    pm.getProbleme().getPanChoixPb().remplirProblemeBox();
	                    pm.getProbleme().getPanChoixPb().deleteItemOfGroupBox(size);
	                    pm.getProbleme().getPanChoixPb().updateUI();
	                    
	                    pm.getBenchmark().getPanBenchmarkPb().remplirProblemeBox();
	                    pm.getBenchmark().getPanBenchmarkPb().updateUI();
	                    
                    } catch (UnauthorizedOperationException ex) {
                    	JOptionPane.showMessageDialog(null,
                                ex.getLocalizedMessage(),
                                "Impossible de supprimer ce problème : interdit pour vous !",
                                JOptionPane.ERROR_MESSAGE);
                    } catch (DataNotFoundException ed) {
                    	JOptionPane.showMessageDialog(null,
                                ed.getLocalizedMessage(),
                                "Impossible de supprimer ce problème : problème non troubé !",
                                JOptionPane.ERROR_MESSAGE);
					}
                    
                }
            }
        }
    }
}
