package client.control.probleme;

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

import javax.swing.JOptionPane;

import client.Application;
import client.ApplicationHelper;
import client.model.problem.Contrainte;
import client.model.problem.Probleme;
import client.model.user.Droits;
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 Modifier Problème.
 *
 * @author Dream Team - ING2
 */
public class ControleurBoutonModifier 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 Modifier PanelProbleme et de récuperer le Panel Problème
     *
     */
    public ControleurBoutonModifier() {}

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode est l'ecouteur du bouton Modifier PanelProbleme. Si l'utilisateur clique dessus, il accede au panel
     * panModifPb (Panel Modifier PanelProbleme) où il pourra modifier le problème choisi.
     *
     */
    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;

        if(prg !=null)
            idGroup = Application.getInstance().getIdGroupe(prg.getAccueil().getNomGroupe());
        else
            idGroup = Application.getInstance().getIdGroupe(pm.getAccueil().getNomGroupe());

        //On test si ce role possède le droit de modification de problème
        if (ApplicationHelper.ARoleCanInGroup(Application.idSelect, idGroup, Droits.MODIFIER_PROBLEME)) {
        	
        	//Pour les responsables
            if(prg != null){
            	String nomProbleme = prg.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem().toString();
            	Probleme problemToModify = Application.getInstance().getProbleme(nomProbleme);
            	
                //prg.getProbleme().getPanModifPb().getvaluesListDefaultModelFonction().removeAllElements();
                prg.getProbleme().getPanModifPb().RemoveAllElementsFromTable(prg.getProbleme().getPanModifPb().getValuesTableDefaultModelContrainte());

                //On ajoute les infos concernant le problème
                prg.getProbleme().getPanModifPb().getTitreProbleme().setText((String) "<html><u>" + prg.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem() + "</u></html>");
                prg.getProbleme().getPanModifPb().getNomProbleme().setText(problemToModify.getNomProbleme());
                prg.getProbleme().getPanModifPb().getFonc().setText(problemToModify.getNomFonction());
                prg.getProbleme().getPanModifPb().getFoncEnText().setText(problemToModify.getLibelleFonction());
                prg.getProbleme().getPanModifPb().getDimFoncEnText().setText(""+problemToModify.getDimensionFonction());
                prg.getProbleme().getPanModifPb().getvaluesListDefaultModelFonction().add(0,problemToModify.getAppelFonction());
                prg.getProbleme().getPanModifPb().getSolProbleme().setText(problemToModify.getSolutionExacte());
                
                //On ajoute la dérivée
                if(problemToModify.getDeriveeOrdreUn().size()>0){
	                Object[] infosDerive = {"Derive : " ,problemToModify.getDerive(0).getParameters(2).getContent(), ""+problemToModify.getDerive(0).getParameters(1).getContent(), ""+problemToModify.getDerive(0).getParameters(0).getContent()};
	                prg.getProbleme().getPanModifPb().getValuesTableDefaultModelContrainte().addRow(infosDerive);
                }
                
                //On ajoute les contraintes
                for(Contrainte contrainte : problemToModify.getVectContraintes()){
	                Object[] infosContrainte = {"Contrainte : ",contrainte.getParameters(2).getContent(), ""+contrainte.getParameters(1).getContent(), ""+contrainte.getParameters(0).getContent()};
	                prg.getProbleme().getPanModifPb().getValuesTableDefaultModelContrainte().addRow(infosContrainte);
                }
                
                //On cache tout les panels sauf le celui de modifier
                prg.getProbleme().getPanChoixPb().setVisible(false);
                prg.getProbleme().getPanCreerPb().setVisible(false);
                prg.getProbleme().getPanConsultPb().setVisible(false);
                prg.getProbleme().getPanExecPb().setVisible(false);
                prg.getProbleme().getPanModifPb().setVisible(true);
                
            //Pour les membres
            }else if(pm != null){
            	String nomProbleme = pm.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem().toString();
               	
            	Probleme problemToModify = Application.getInstance().getProbleme(nomProbleme);

                //pm.getProbleme().getPanModifPb().getvaluesListDefaultModelFonction().removeAllElements();
                pm.getProbleme().getPanModifPb().RemoveAllElementsFromTable(pm.getProbleme().getPanModifPb().getValuesTableDefaultModelContrainte());

                //On ajoute les infos concernant le problème
                pm.getProbleme().getPanModifPb().getTitreProbleme().setText((String) "<html><u>" + pm.getProbleme().getPanChoixPb().getProblemeBox().getSelectedItem() + "</u></html>");
                pm.getProbleme().getPanModifPb().getNomProbleme().setText(problemToModify.getNomProbleme());
                pm.getProbleme().getPanModifPb().getFonc().setText(problemToModify.getNomFonction());
                pm.getProbleme().getPanModifPb().getFoncEnText().setText(problemToModify.getLibelleFonction());
                pm.getProbleme().getPanModifPb().getDimFoncEnText().setText(""+problemToModify.getDimensionFonction());
                pm.getProbleme().getPanModifPb().getvaluesListDefaultModelFonction().add(0,problemToModify.getAppelFonction());
                pm.getProbleme().getPanModifPb().getSolProbleme().setText(problemToModify.getSolutionExacte());
                
                //On ajoute la dérivée
                if(problemToModify.getDeriveeOrdreUn().size()>0){
	                Object[] infosDerive = {"Derive : " ,problemToModify.getDerive(0).getParameters(2).getContent(), ""+problemToModify.getDerive(0).getParameters(1).getContent(), ""+problemToModify.getDerive(0).getParameters(0).getContent()};
	                pm.getProbleme().getPanModifPb().getValuesTableDefaultModelContrainte().addRow(infosDerive);
                }
                
                //On ajoute les contraintes
                for(Contrainte contrainte : problemToModify.getVectContraintes()){
	                Object[] infosContrainte = {"Contrainte : ",contrainte.getParameters(2).getContent(), ""+contrainte.getParameters(1).getContent(), ""+contrainte.getParameters(0).getContent()};
	                pm.getProbleme().getPanModifPb().getValuesTableDefaultModelContrainte().addRow(infosContrainte);
                }
                
                //On cache tout les panels sauf le celui de modifier
                pm.getProbleme().getPanChoixPb().setVisible(false);
                pm.getProbleme().getPanCreerPb().setVisible(false);
                pm.getProbleme().getPanConsultPb().setVisible(false);
                pm.getProbleme().getPanExecPb().setVisible(false);
                pm.getProbleme().getPanModifPb().setVisible(true);
            }
        }else{
        	JOptionPane.showMessageDialog(pm.getProbleme(), "Vous n'avez pas les droits pour modifier un problème", "Erreur", JOptionPane.ERROR_MESSAGE);
        }
    }
}