package client.view.benchmarks;

import java.awt.Color;

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

import client.control.benchmark.EcouteurExecBenchmarks;

/**
 * <u><b>Explication générale de la classe :</b></u>
 * <P>
 * Cette classe permet de gérer le panel concernant les donditions initiales.
 * 
 * @author Dream Team - ING2
 */
public class PanelCondiInitial 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 JButton executer, annuler;

	public PanelCondiInitial() {

		// On met le panel à notre convenance
		this.setBackground(new Color(234, 232, 233));
		this.setLayout(null);

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

		// Problème
		titreProbleme = new JLabel();
		titreProbleme.setBounds(200, 20, 150, 15);
		add(titreProbleme);

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

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

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

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

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

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

		// Température
		temperatureLabel = new JLabel("Temperature (°C): ");
		temperatureLabel.setBounds(10, 160, 170, 20);
		temperatureLabel.setVisible(false);
		add(temperatureLabel);

		temperature = new JTextField();
		temperature.setBounds(150, 160, 200, 20);
		temperature.setVisible(false);
		add(temperature);

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

		sizeOfInitialPop = new JTextField();
		sizeOfInitialPop.setBounds(150, 180, 200, 20);
		sizeOfInitialPop.setVisible(false);
		add(sizeOfInitialPop);

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

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

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

		explorationStep = new JTextField();
		explorationStep.setBounds(150, 220, 200, 20);
		explorationStep.setVisible(false);
		add(explorationStep);

		// Niveau d'itération
		iterationLevelLabel = new JLabel("Niveau d'Itération  : ");
		iterationLevelLabel.setBounds(10, 240, 170, 20);
		iterationLevelLabel.setVisible(false);
		add(iterationLevelLabel);

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

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

		crossProba = new JTextField();
		crossProba.setBounds(150, 260, 200, 20);
		crossProba.setVisible(false);
		add(crossProba);

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

		mutationProba = new JTextField();
		mutationProba.setBounds(150, 280, 200, 20);
		mutationProba.setVisible(false);
		add(mutationProba);

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

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

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

		sup = new JTextField();
		sup.setBounds(150, 320, 200, 20);
		sup.setVisible(false);
		add(sup);

		// Listener
		CacherLabel();
		EcouteurExecBenchmarks listenerExecBench = new EcouteurExecBenchmarks();

		// Bouton annuler
		annuler = new JButton("Annuler");
		annuler.setActionCommand(EcouteurExecBenchmarks.ANNULER);
		annuler.addActionListener(listenerExecBench);
		annuler.setBounds(100, 400, 100, 20);
		add(annuler);

		// Bouton exécuter
		executer = new JButton("Executer");
		executer.setActionCommand(EcouteurExecBenchmarks.VALIDER);
		executer.addActionListener(listenerExecBench);
		executer.setBounds(200, 400, 100, 20);
		add(executer);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le titre du problème
	 * 
	 * @return le titre du problème
	 * 
	 */
	public JLabel getTitreProbleme() {
		return titreProbleme;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le bouton permettant d'exécuter le
	 * benchmark
	 * 
	 * @return le bouton permettant d'exécuter le benchmark
	 * 
	 */
	public JButton getExecuter() {
		return executer;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le vecteur initial
	 * 
	 * @return le vecteur initial
	 * 
	 */
	public JLabel getInitialVectorLabel() {
		return initialVectorLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label de l'epsilon
	 * 
	 * @return epsilon
	 * 
	 */
	public JLabel getEpsilonLabel() {
		return epsilonLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label des itérations
	 * 
	 * @return le nombre d'itérations
	 * 
	 */
	public JLabel getIterationLabel() {
		return iterationLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label du pas
	 * 
	 * @return le pas
	 * 
	 */
	public JLabel getStepLabel() {
		return stepLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label de la température
	 * 
	 * @return la température
	 * 
	 */
	public JLabel getTemperatureLabel() {
		return temperatureLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le le label du pas d'exploration
	 * 
	 * @return le pas d'exploration
	 * 
	 */
	public JLabel getExplorationStepLabel() {
		return explorationStepLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le le label du niveau d'itérations
	 * 
	 * @return le niveau d'itérations
	 * 
	 */
	public JLabel getIterationLevelLabel() {
		return iterationLevelLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label de la taille initiale de la
	 * population
	 * 
	 * @return la taille initiale de la population
	 * 
	 */
	public JLabel getSizeOfInitialPopLabel() {
		return sizeOfInitialPopLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label de la probabilité de
	 * croisements
	 * 
	 * @return la probabilité de croisements
	 * 
	 */
	public JLabel getCrossProbaLabel() {
		return crossProbaLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label de la probabilité de mutations
	 * 
	 * @return la probabilité de mutations
	 * 
	 */
	public JLabel getMutationProbaLabel() {
		return mutationProbaLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label de la borne inférieure
	 * 
	 * @return la borne inférieure
	 * 
	 */
	public JLabel getInfLabel() {
		return infLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le label de la borne supérieure
	 * 
	 * @return la borne supérieure
	 * 
	 */
	public JLabel getSupLabel() {
		return supLabel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le vecteur initiale
	 * 
	 * @return le vecteur initiale
	 * 
	 */
	public JTextField getInitialVector() {
		return initialVector;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer l'epsilon
	 * 
	 * @return l'epsilon
	 * 
	 */
	public JTextField getEpsilon() {
		return epsilon;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer les itérations
	 * 
	 * @return le nombre d'itérations
	 * 
	 */
	public JTextField getIteration() {
		return iteration;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le pas
	 * 
	 * @return le pas
	 * 
	 */
	public JTextField getStep() {
		return step;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer la température
	 * 
	 * @return la température
	 * 
	 */
	public JTextField getTemperature() {
		return temperature;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer le pas d'exploration
	 * 
	 * @return le pas d'exploration
	 * 
	 */
	public JTextField getExplorationStep() {
		return explorationStep;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer l'itération
	 * 
	 * @return l'itération
	 * 
	 */
	public JTextField getIterationLevel() {
		return iterationLevel;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer la taille de la population initiale
	 * 
	 * @return la taille de la population initiale
	 * 
	 */
	public JTextField getSizeOfInitialPop() {
		return sizeOfInitialPop;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer la probabilité de croisements
	 * 
	 * @return la probabilité de croisements
	 * 
	 */
	public JTextField getCrossProba() {
		return crossProba;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer la probabilité de mutations
	 * 
	 * @return la probabilité de mutations
	 * 
	 */
	public JTextField getMutationProba() {
		return mutationProba;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer la borne inférieure
	 * 
	 * @return la borne inférieure
	 * 
	 */
	public JTextField getInf() {
		return inf;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de récupérer la borne supérieure
	 * 
	 * @return la borne supérieure
	 * 
	 */
	public JTextField getSup() {
		return sup;
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet d'afficher les labels
	 * 
	 */
	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);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de cacher les labels
	 * 
	 */
	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);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet de vider les champs
	 * 
	 */
	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);

	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet d'afficher les conditions initiales de la méthode
	 * souhaitée
	 * 
	 */
	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);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet d'afficher les conditions initiales de la méthode
	 * souhaitée
	 * 
	 */
	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);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet d'afficher les conditions initiales de la méthode
	 * souhaitée
	 * 
	 */
	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);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet d'afficher les conditions initiales de la méthode
	 * souhaitée
	 * 
	 */
	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);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet d'afficher les conditions initiales de la méthode
	 * souhaitée
	 * 
	 */
	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);
	}

	/**
	 * <u><i>Explication de la méthode :</i></u>
	 * <P>
	 * Cette méthode permet d'afficher les conditions initiales de la méthode
	 * souhaitée
	 * 
	 */
	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);
	}

}
