package client.control.probleme;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.ConsoleHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JComboBox;

import client.view.Probleme.PanelExecuterProbleme;
import client.view.Probleme.PanelProbleme;
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 de la ComboBox où se situe le nom des
 * différents problème.
 *
 * @author Dream Team - ING2
 */
public class ControleurComboBox implements ActionListener {

	private static final Level LOG_LEVEL = Level.OFF;

	private static final Logger logger = Logger.getLogger(ControleurComboBox.class.getName());
	static{
		logger.setLevel(LOG_LEVEL);
		Handler handler = new ConsoleHandler();
		handler.setLevel(LOG_LEVEL);
		logger.addHandler(handler);
	}

    private JComboBox boxPb;

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

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode est l'écouteur de la ComboBox. Il permet en fonction du choix de l'utilisateur d'afficher les
     * panels et boutons desirés.
     *
     */
    public void actionPerformed(ActionEvent e) {
        Component c = (Component) e.getSource();

        PanelRespoGroupe prg = null;
        PanelMembre pm = null;

        logger.fine("Starting fetching loop");

        while (c != null) {
        	logger.log(Level.FINER,"Loop item : {0}",c.getClass().getCanonicalName());
            if (c instanceof PanelRespoGroupe) {
                prg = (PanelRespoGroupe) c;
            } else if (c instanceof PanelMembre) {
                pm = (PanelMembre) c;
            }
            c = c.getParent();
        }

        logger.log(Level.FINE,"Loop ended : \n\t-group panel : {0}\n\t-member panel : {1}", new Object[]{prg,pm});

        if (prg != null) {
        	logger.fine("Group panel is not null, then proceed with that case...");
        	logger.log(Level.FINE,"Selected item : {0}",boxPb.getSelectedItem());
            if (boxPb.getSelectedItem().toString().equals("Créer un problème")) {

            	logger.log(Level.FINE,"Action : Créer Problème");

                prg.getProbleme().getPanChoixPb().getB1().setVisible(false);
                prg.getProbleme().getPanChoixPb().getB2().setVisible(false);
                prg.getProbleme().getPanChoixPb().getB3().setVisible(false);
                prg.getProbleme().getPanChoixPb().getExecuter().setVisible(false);

                prg.getProbleme().getPanModifPb().setVisible(false);
                prg.getProbleme().getPanExecPb().setVisible(false);
                prg.getProbleme().getPanConsultPb().setVisible(false);
                prg.getProbleme().getPanChoixPb().setVisible(false);
                prg.getProbleme().getPanCreerPb().setVisible(true);

                logger.finest("Let's start exploration");

                PanelProbleme         probleme  = prg.getProbleme();
                logger.log(Level.FINEST,"Probleme panel fetched\n\t- {0}",probleme);
                PanelExecuterProbleme panExecPb = probleme.getPanExecPb();
                logger.log(Level.FINEST,"Execution Probleme panel fetched\n\t- {0}",panExecPb);
                JComboBox             methods   = panExecPb.getMethodes();
                logger.log(Level.FINEST,"Methodes combo box fetched\n\t- {0}",methods);
                for( int i = 0; i < methods.getModel().getSize(); i++){
                    logger.log(Level.FINEST,"Methodes combo box item \n\t{1} - {0}",new Object[]{methods.getModel().getElementAt(i),i});
                }

                logger.fine("Créer problème handled");

            } else if (boxPb.getSelectedItem().toString().equals("--------------------------------------------")) {

            	logger.log(Level.FINE,"Action : -----------------------------------");

                prg.getProbleme().getPanChoixPb().getB1().setVisible(false);
                prg.getProbleme().getPanChoixPb().getB2().setVisible(false);
                prg.getProbleme().getPanChoixPb().getB3().setVisible(false);
                prg.getProbleme().getPanChoixPb().getExecuter().setVisible(false);

                prg.getProbleme().getPanModifPb().setVisible(false);
                prg.getProbleme().getPanConsultPb().setVisible(false);
                prg.getProbleme().getPanCreerPb().setVisible(false);
                prg.getProbleme().getPanExecPb().setVisible(false);
                prg.getProbleme().getPanExecPb().getMethodes().setSelectedIndex(0);
            }

            if (
            		!boxPb.getSelectedItem().toString().equals("--------------------------------------------")
            		&& !boxPb.getSelectedItem().toString().equals("Créer un problème")) {

            	logger.log(Level.FINE,"Action : strange case...");

                prg.getProbleme().getPanCreerPb().setVisible(false);

                prg.getProbleme().getPanModifPb().getvaluesListDefaultModelFonction().removeAllElements();
                prg.getProbleme().getPanModifPb().RemoveAllElementsFromTable(prg.getProbleme().getPanModifPb().getValuesTableDefaultModelContrainte());

                prg.getProbleme().getPanModifPb().getFonc().setText("");
                prg.getProbleme().getPanModifPb().getNomProbleme().setText("");
                prg.getProbleme().getPanModifPb().getFoncEnText().setText("");

                prg.getProbleme().getPanChoixPb().getB1().setVisible(true);
                prg.getProbleme().getPanChoixPb().getB2().setVisible(true);
                prg.getProbleme().getPanChoixPb().getB3().setVisible(true);
                prg.getProbleme().getPanChoixPb().getExecuter().setVisible(true);
            }

        	logger.log(Level.FINE,"Group panel's actions handled");

        } else if (pm != null) {
            if (boxPb.getSelectedItem().toString().equals("Créer un problème")) {

                pm.getProbleme().getPanChoixPb().getB1().setVisible(false);
                pm.getProbleme().getPanChoixPb().getB2().setVisible(false);
                pm.getProbleme().getPanChoixPb().getB3().setVisible(false);
                pm.getProbleme().getPanChoixPb().getExecuter().setVisible(false);

                pm.getProbleme().getPanModifPb().setVisible(false);
                pm.getProbleme().getPanExecPb().setVisible(false);
                pm.getProbleme().getPanConsultPb().setVisible(false);
                pm.getProbleme().getPanChoixPb().setVisible(false);
                pm.getProbleme().getPanCreerPb().setVisible(true);

                pm.getProbleme().getPanExecPb().getMethodes().setSelectedIndex(0);

            } else if (boxPb.getSelectedItem().toString().equals("--------------------------------------------")) {

                pm.getProbleme().getPanChoixPb().getB1().setVisible(false);
                pm.getProbleme().getPanChoixPb().getB2().setVisible(false);
                pm.getProbleme().getPanChoixPb().getB3().setVisible(false);
                pm.getProbleme().getPanChoixPb().getExecuter().setVisible(false);

                pm.getProbleme().getPanModifPb().setVisible(false);
                pm.getProbleme().getPanConsultPb().setVisible(false);
                pm.getProbleme().getPanCreerPb().setVisible(false);
                pm.getProbleme().getPanExecPb().setVisible(false);
                pm.getProbleme().getPanExecPb().getMethodes().setSelectedIndex(0);

            }

            if (
            		!boxPb.getSelectedItem().toString().equals("--------------------------------------------")
            		&& !boxPb.getSelectedItem().toString().equals("Créer un problème")) {

                pm.getProbleme().getPanCreerPb().setVisible(false);

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

                pm.getProbleme().getPanModifPb().getFonc().setText("");
                pm.getProbleme().getPanModifPb().getNomProbleme().setText("");
                pm.getProbleme().getPanModifPb().getFoncEnText().setText("");

                pm.getProbleme().getPanChoixPb().getB1().setVisible(true);
                pm.getProbleme().getPanChoixPb().getB2().setVisible(true);
                pm.getProbleme().getPanChoixPb().getB3().setVisible(true);
                pm.getProbleme().getPanChoixPb().getExecuter().setVisible(true);
            }
        }

    	logger.exiting(getClass().getCanonicalName(), "actionPerformed");
    }
}
