package client.view.Probleme;

import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import client.control.probleme.ControleurBoutonAnnulerExecute;
import client.control.probleme.ControleurBoutonValiderProb;
import client.model.problem.Methode;

/** <u><b>Explication générale de la classe :</b></u>
 * <P>Cette classe permet de créer le panel pour exécuter un problème
 *
 * @author Dream Team - ING2
 */
public class PanelExecuterProbleme extends JPanel {

    //Déclaration des variables
    private JLabel titreProbleme, initialVectorLabel, epsilonLabel, iterationLabel, stepLabel,temperatureLabel,
	explorationStepLabel, iterationLevelLabel, sizeOfInitialPopLabel, 
	crossProbaLabel, mutationProbaLabel, infLabel, supLabel;
    
    private JTextField initialVector, epsilon, iteration, step, temperature,
	explorationStep, iterationLevel, sizeOfInitialPop, crossProba,
	mutationProba, inf, sup;
    
    private String[] sMethodeBox = {"------------------------------------------------",
    		"Méthodes déterministes","------------------------------------------------",
    		Methode.METHODE_PAS_FIXE,Methode.METHODE_PAS_OPTIMAL,Methode.METHODE_NEWTON,Methode.METHODE_PROJECTION,
    		Methode.METHODE_LAGRANGE,Methode.METHODE_PENALISATION,
    		"------------------------------------------------",
    		"Méthodes non déterministes","------------------------------------------------",
    		Methode.METHODE_RECUIT_SIMULE,Methode.METHODE_ALGO_EVOLUTIONNAIRE,Methode.METHODE_TABOU};
    private JComboBox methodes;
    private JButton executer, annuler;

    public PanelExecuterProbleme(){

        this.setBackground(new Color(234, 232, 233));
        this.setLayout(null);

        titreProbleme = new JLabel();
        titreProbleme.setBounds(200, 20, 150, 15);
        add(titreProbleme);

        methodes = new JComboBox(sMethodeBox);
        methodes.setBounds(70, 50, 300, 20);
        add(methodes);

        this.setBackground(Color.LIGHT_GRAY);
		this.setLayout(null);

		initialVectorLabel = new JLabel("Vecteur initial : ");
		initialVectorLabel.setBounds(10, 100, 100, 20);
		add(initialVectorLabel);

		initialVector = new JTextField();
		initialVector.setBounds(190, 100, 200, 20);
		add(initialVector);

		iterationLabel = new JLabel("Itération(s) : ");
		iterationLabel.setBounds(10, 120, 100, 20);
		iterationLabel.setVisible(false);
		add(iterationLabel);

		iteration = new JTextField();
		iteration.setBounds(190, 120, 200, 20);
		iteration.setVisible(false);
		add(iteration);

		epsilonLabel = new JLabel("Epsilon : ");
		epsilonLabel.setBounds(10, 140, 100, 20);
		epsilonLabel.setVisible(false);
		add(epsilonLabel);

		epsilon = new JTextField();
		epsilon.setBounds(190, 140, 200, 20);
		epsilon.setVisible(false);
		add(epsilon);

		temperatureLabel = new JLabel("Temperature (°C): ");
		temperatureLabel.setBounds(10, 140, 170, 20);
		temperatureLabel.setVisible(false);
		add(temperatureLabel);

		temperature = new JTextField();
		temperature.setBounds(190, 140, 200, 20);
		temperature.setVisible(false);
		add(temperature);

		sizeOfInitialPopLabel = new JLabel(
				"Taille initiale de la population : ");
		sizeOfInitialPopLabel.setBounds(10, 140, 200, 20);
		sizeOfInitialPopLabel.setVisible(false);
		add(sizeOfInitialPopLabel);

		sizeOfInitialPop = new JTextField();
		sizeOfInitialPop.setBounds(190, 140, 200, 20);
		sizeOfInitialPop.setVisible(false);
		add(sizeOfInitialPop);

		stepLabel = new JLabel("Pas : ");
		stepLabel.setBounds(10, 160, 70, 20);
		stepLabel.setVisible(false);
		add(stepLabel);

		step = new JTextField();
		step.setBounds(190, 160, 200, 20);
		step.setVisible(false);
		add(step);

		explorationStepLabel = new JLabel("Pas d'exploration : ");
		explorationStepLabel.setBounds(10, 160, 170, 20);
		explorationStepLabel.setVisible(false);
		add(explorationStepLabel);

		explorationStep = new JTextField();
		explorationStep.setBounds(190, 160, 200, 20);
		explorationStep.setVisible(false);
		add(explorationStep);
		
		iterationLevelLabel = new JLabel("Niveau d'Itération  : ");
		iterationLevelLabel.setBounds(10, 160, 170, 20);
		iterationLevelLabel.setVisible(false);
		add(iterationLevelLabel);
		
		iterationLevel = new JTextField();
		iterationLevel.setBounds(190, 160, 200, 20);
		iterationLevel.setVisible(false);
		add(iterationLevel);

		crossProbaLabel = new JLabel("Probabilité Croisements : ");
		crossProbaLabel.setBounds(10, 160, 170, 20);
		crossProbaLabel.setVisible(false);
		add(crossProbaLabel);

		crossProba = new JTextField();
		crossProba.setBounds(190, 160, 200, 20);
		crossProba.setVisible(false);
		add(crossProba);

		mutationProbaLabel = new JLabel("Probabilité Mutations: ");
		mutationProbaLabel.setBounds(10, 180, 170, 20);
		mutationProbaLabel.setVisible(false);
		add(mutationProbaLabel);

		mutationProba = new JTextField();
		mutationProba.setBounds(190, 180, 200, 20);
		mutationProba.setVisible(false);
		add(mutationProba);

		infLabel = new JLabel("Borne inférieur: ");
		infLabel.setBounds(10, 200, 150, 20);
		infLabel.setVisible(false);
		add(infLabel);

		inf = new JTextField();
		inf.setBounds(190, 200, 200, 20);
		inf.setVisible(false);
		add(inf);

		supLabel = new JLabel("Borne supérieur: ");
		supLabel.setBounds(10, 220, 130, 20);
		supLabel.setVisible(false);
		add(supLabel);

		sup = new JTextField();
		sup.setBounds(190, 220, 200, 20);
		sup.setVisible(false);
		add(sup);

        CacherLabel();
        
        annuler = new JButton("Annuler");
        annuler.addActionListener(new ControleurBoutonAnnulerExecute());
        annuler.setBounds(150, 400, 100, 20);
        add(annuler);
        
        executer = new JButton("Executer");
        executer.addActionListener(new ControleurBoutonValiderProb());
        executer.setBounds(250, 400, 100, 20);
        add(executer);

        TitledBorder titleInfo = new TitledBorder("Executer Problème");
        titleInfo.setTitleColor(Color.BLUE);
        this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLUE));
        this.setBorder(BorderFactory.createTitledBorder(titleInfo));
    }


    
    public JLabel getTitreProbleme() {
        return titreProbleme;
    }

    public JButton getExecuter() {
        return executer;
    }

    public JComboBox getMethodes() {
        return methodes;
    }
    
   /**
	 * @return the initialVectorLabel
	 */
	public JLabel getInitialVectorLabel() {
		return initialVectorLabel;
	}

	/**
	 * @param initialVectorLabel the initialVectorLabel to set
	 */
	public void setInitialVectorLabel(JLabel initialVectorLabel) {
		this.initialVectorLabel = initialVectorLabel;
	}

	/**
	 * @return the epsilonLabel
	 */
	public JLabel getEpsilonLabel() {
		return epsilonLabel;
	}

	/**
	 * @param epsilonLabel the epsilonLabel to set
	 */
	public void setEpsilonLabel(JLabel epsilonLabel) {
		this.epsilonLabel = epsilonLabel;
	}

	/**
	 * @return the iterationLabel
	 */
	public JLabel getIterationLabel() {
		return iterationLabel;
	}

	/**
	 * @param iterationLabel the iterationLabel to set
	 */
	public void setIterationLabel(JLabel iterationLabel) {
		this.iterationLabel = iterationLabel;
	}

	/**
	 * @return the stepLabel
	 */
	public JLabel getStepLabel() {
		return stepLabel;
	}

	/**
	 * @param stepLabel the stepLabel to set
	 */
	public void setStepLabel(JLabel stepLabel) {
		this.stepLabel = stepLabel;
	}

	/**
	 * @return the temperatureLabel
	 */
	public JLabel getTemperatureLabel() {
		return temperatureLabel;
	}

	/**
	 * @param temperatureLabel the temperatureLabel to set
	 */
	public void setTemperatureLabel(JLabel temperatureLabel) {
		this.temperatureLabel = temperatureLabel;
	}

	/**
	 * @return the explorationStepLabel
	 */
	public JLabel getExplorationStepLabel() {
		return explorationStepLabel;
	}

	/**
	 * @param explorationStepLabel the explorationStepLabel to set
	 */
	public void setExplorationStepLabel(JLabel explorationStepLabel) {
		this.explorationStepLabel = explorationStepLabel;
	}

	/**
	 * @return the iterationLevelLabel
	 */
	public JLabel getIterationLevelLabel() {
		return iterationLevelLabel;
	}

	/**
	 * @param iterationLevelLabel the iterationLevelLabel to set
	 */
	public void setIterationLevelLabel(JLabel iterationLevelLabel) {
		this.iterationLevelLabel = iterationLevelLabel;
	}

	/**
	 * @return the sizeOfInitialPopLabel
	 */
	public JLabel getSizeOfInitialPopLabel() {
		return sizeOfInitialPopLabel;
	}

	/**
	 * @param sizeOfInitialPopLabel the sizeOfInitialPopLabel to set
	 */
	public void setSizeOfInitialPopLabel(JLabel sizeOfInitialPopLabel) {
		this.sizeOfInitialPopLabel = sizeOfInitialPopLabel;
	}

	/**
	 * @return the crossProbaLabel
	 */
	public JLabel getCrossProbaLabel() {
		return crossProbaLabel;
	}

	/**
	 * @param crossProbaLabel the crossProbaLabel to set
	 */
	public void setCrossProbaLabel(JLabel crossProbaLabel) {
		this.crossProbaLabel = crossProbaLabel;
	}

	/**
	 * @return the mutationProbaLabel
	 */
	public JLabel getMutationProbaLabel() {
		return mutationProbaLabel;
	}

	/**
	 * @param mutationProbaLabel the mutationProbaLabel to set
	 */
	public void setMutationProbaLabel(JLabel mutationProbaLabel) {
		this.mutationProbaLabel = mutationProbaLabel;
	}

	/**
	 * @return the infLabel
	 */
	public JLabel getInfLabel() {
		return infLabel;
	}

	/**
	 * @param infLabel the infLabel to set
	 */
	public void setInfLabel(JLabel infLabel) {
		this.infLabel = infLabel;
	}

	/**
	 * @return the supLabel
	 */
	public JLabel getSupLabel() {
		return supLabel;
	}

	/**
	 * @param supLabel the supLabel to set
	 */
	public void setSupLabel(JLabel supLabel) {
		this.supLabel = supLabel;
	}
	
	
	/**
	 * @return the initialVector
	 */
	public JTextField getInitialVector() {
		return initialVector;
	}


	/**
	 * @param initialVector the initialVector to set
	 */
	public void setInitialVector(JTextField initialVector) {
		this.initialVector = initialVector;
	}


	/**
	 * @return the epsilon
	 */
	public JTextField getEpsilon() {
		return epsilon;
	}


	/**
	 * @param epsilon the epsilon to set
	 */
	public void setEpsilon(JTextField epsilon) {
		this.epsilon = epsilon;
	}

	/**
	 * @return the iteration
	 */
	public JTextField getIteration() {
		return iteration;
	}

	/**
	 * @param iteration the iteration to set
	 */
	public void setIteration(JTextField iteration) {
		this.iteration = iteration;
	}

	/**
	 * @return the step
	 */
	public JTextField getStep() {
		return step;
	}

	/**
	 * @param step the step to set
	 */
	public void setStep(JTextField step) {
		this.step = step;
	}

	/**
	 * @return the temperature
	 */
	public JTextField getTemperature() {
		return temperature;
	}

	/**
	 * @param temperature the temperature to set
	 */
	public void setTemperature(JTextField temperature) {
		this.temperature = temperature;
	}

	/**
	 * @return the explorationStep
	 */
	public JTextField getExplorationStep() {
		return explorationStep;
	}

	/**
	 * @param explorationStep the explorationStep to set
	 */
	public void setExplorationStep(JTextField explorationStep) {
		this.explorationStep = explorationStep;
	}

	/**
	 * @return the iterationLevel
	 */
	public JTextField getIterationLevel() {
		return iterationLevel;
	}

	/**
	 * @param iterationLevel the iterationLevel to set
	 */
	public void setIterationLevel(JTextField iterationLevel) {
		this.iterationLevel = iterationLevel;
	}

	/**
	 * @return the sizeOfInitialPop
	 */
	public JTextField getSizeOfInitialPop() {
		return sizeOfInitialPop;
	}

	/**
	 * @param sizeOfInitialPop the sizeOfInitialPop to set
	 */
	public void setSizeOfInitialPop(JTextField sizeOfInitialPop) {
		this.sizeOfInitialPop = sizeOfInitialPop;
	}

	/**
	 * @return the crossProba
	 */
	public JTextField getCrossProba() {
		return crossProba;
	}

	/**
	 * @param crossProba the crossProba to set
	 */
	public void setCrossProba(JTextField crossProba) {
		this.crossProba = crossProba;
	}

	/**
	 * @return the mutationProba
	 */
	public JTextField getMutationProba() {
		return mutationProba;
	}

	/**
	 * @param mutationProba the mutationProba to set
	 */
	public void setMutationProba(JTextField mutationProba) {
		this.mutationProba = mutationProba;
	}

	/**
	 * @return the inf
	 */
	public JTextField getInf() {
		return inf;
	}

	/**
	 * @param inf the inf to set
	 */
	public void setInf(JTextField inf) {
		this.inf = inf;
	}

	/**
	 * @return the sup
	 */
	public JTextField getSup() {
		return sup;
	}

	/**
	 * @param sup the sup to set
	 */
	public void setSup(JTextField sup) {
		this.sup = sup;
	}

	/**
	 * @param methodes the methodes to set
	 */
	public void setMethodes(JComboBox methodes) {
		this.methodes = methodes;
	}

	/**
	 * @param executer the executer to set
	 */
	public void setExecuter(JButton executer) {
		this.executer = executer;
	}

	public void AfficherLabel(){
		initialVectorLabel.setVisible(true);
    	epsilonLabel.setVisible(true); 
    	iterationLabel.setVisible(true);
    	stepLabel.setVisible(true);
    	temperatureLabel.setVisible(true);
    	explorationStepLabel.setVisible(true);
    	iterationLevelLabel.setVisible(true);
    	sizeOfInitialPopLabel.setVisible(true);
    	crossProbaLabel.setVisible(true);
    	mutationProbaLabel.setVisible(true);
    	infLabel.setVisible(true);
    	supLabel.setVisible(true); 
   }

   public final void CacherLabel(){
	    initialVectorLabel.setVisible(false);
	   	epsilonLabel.setVisible(false); 
	   	iterationLabel.setVisible(false);
	   	stepLabel.setVisible(false);
	   	temperatureLabel.setVisible(false);
	   	explorationStepLabel.setVisible(false);
	   	iterationLevelLabel.setVisible(false);
	   	sizeOfInitialPopLabel.setVisible(false);
	   	crossProbaLabel.setVisible(false);
	   	mutationProbaLabel.setVisible(false);
	   	infLabel.setVisible(false);
	   	supLabel.setVisible(false); 
	   	
	   	initialVector.setVisible(false);
	   	epsilon.setVisible(false); 
	   	iteration.setVisible(false);
	   	step.setVisible(false);
	   	temperature.setVisible(false);
	   	explorationStep.setVisible(false);
	   	iterationLevel.setVisible(false);
	   	sizeOfInitialPop.setVisible(false);
	   	crossProba.setVisible(false);
	   	mutationProba.setVisible(false);
	   	inf.setVisible(false);
	   	sup.setVisible(false); 
   }
   
   public void ViderPanelCondiMethode() {

		initialVectorLabel.setVisible(false);
		initialVector.setVisible(false);
		initialVector.setText("");

		epsilon.setVisible(false);
		epsilon.setText("");
		epsilonLabel.setVisible(false);

		iteration.setVisible(false);
		iteration.setText("");
		iterationLabel.setVisible(false);

		step.setVisible(false);
		step.setText("");
		stepLabel.setVisible(false);

		temperature.setVisible(false);
		temperature.setText("");
		temperatureLabel.setVisible(false);

		explorationStep.setVisible(false);
		explorationStep.setText("");
		explorationStepLabel.setVisible(false);

		iterationLevel.setVisible(false);
		iterationLevel.setText("");
		iterationLevelLabel.setVisible(false);

		sizeOfInitialPop.setVisible(false);
		sizeOfInitialPop.setText("");
		sizeOfInitialPopLabel.setVisible(false);

		crossProba.setVisible(false);
		crossProba.setText("");
		crossProbaLabel.setVisible(false);

		mutationProba.setVisible(false);
		mutationProba.setText("");
		mutationProbaLabel.setVisible(false);

		inf.setVisible(false);
		inf.setText("");
		infLabel.setVisible(false);

		sup.setVisible(false);
		sup.setText("");
		supLabel.setVisible(false);

	}

	public void stepFixedMethod() {
		
		CacherLabel();

		initialVectorLabel.setVisible(true);
		initialVector.setVisible(true);
		initialVector.setText("");

		epsilon.setVisible(true);
		epsilon.setText("");
		epsilonLabel.setVisible(true);

		iteration.setVisible(true);
		iteration.setText("");
		iterationLabel.setVisible(true);

		step.setVisible(true);
		step.setText("");
		stepLabel.setVisible(true);
	}

	public void stepOptimalMethod() {

		CacherLabel();
		
		initialVectorLabel.setVisible(true);
		initialVector.setVisible(true);
		initialVector.setText("");

		epsilon.setVisible(true);
		epsilon.setText("");
		epsilonLabel.setVisible(true);

		iteration.setVisible(true);
		iteration.setText("");
		iterationLabel.setVisible(true);
	}

	public void newtonMethod() {

		CacherLabel();
		
		initialVectorLabel.setVisible(true);
		initialVector.setVisible(true);
		initialVector.setText("");

		epsilon.setVisible(true);
		epsilon.setText("");
		epsilonLabel.setVisible(true);

		iteration.setVisible(true);
		iteration.setText("");
		iterationLabel.setVisible(true);

		step.setVisible(true);
		step.setText("");
		stepLabel.setVisible(true);
	}

	public void recuitSimuleMethod() {

		CacherLabel();
		
		initialVectorLabel.setVisible(true);
		initialVector.setVisible(true);
		initialVector.setText("");

		iteration.setVisible(true);
		iteration.setText("");
		iterationLabel.setVisible(true);

		temperature.setVisible(true);
		temperature.setText("");
		temperatureLabel.setVisible(true);

		explorationStep.setVisible(true);
		explorationStep.setText("");
		explorationStepLabel.setVisible(true);
	}

	public void tabouMethod() {

		CacherLabel();
		
		initialVectorLabel.setVisible(true);
		initialVector.setVisible(true);
		initialVector.setText("");

		epsilon.setVisible(true);
		epsilon.setText("");
		epsilonLabel.setVisible(true);

		iteration.setVisible(true);
		iteration.setText("");
		iterationLabel.setVisible(true);

		explorationStep.setVisible(true);
		explorationStep.setText("");
		explorationStepLabel.setVisible(true);
	}

	public void geneticMethod() {

		CacherLabel();
		
		initialVectorLabel.setVisible(true);
		initialVector.setVisible(true);
		initialVector.setText("");

		iteration.setVisible(true);
		iteration.setText("");
		iterationLabel.setVisible(true);

		sizeOfInitialPop.setVisible(true);
		sizeOfInitialPop.setText("");
		sizeOfInitialPopLabel.setVisible(true);

		crossProba.setVisible(true);
		crossProba.setText("");
		crossProbaLabel.setVisible(true);

		mutationProba.setVisible(true);
		mutationProba.setText("");
		mutationProbaLabel.setVisible(true);

		inf.setVisible(true);
		inf.setText("");
		infLabel.setVisible(true);

		sup.setVisible(true);
		sup.setText("");
		supLabel.setVisible(true);
	}

}
