package client.view.Probleme;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import client.Application;
import client.control.probleme.EcouteurBoxResultat;
import client.model.problem.Resultat;

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

    //Déclaration des variables
    private JLabel titreProbleme, fonctionobj, contraintes, resultat, libelleFonction;
    private JPanel panfonc, pancontr;
    private JComboBox resultatBox;
    JScrollPane scrollRes;
    private PanelResultat panres;
    private DefaultTableModel valuesTableDefaultModelContrainte;
    private JTable tableContrainte;
    private Object[] nomColonne = {"Contrainte", "Nom Fichier", "Nom Fonction", "Libellé Contrainte"};

    /**<u><i>Explication générale du constructeur :</i></u>
     * <P> Constructeur de la classe permettant de créer un panel Consulter Problème
     *
     */
    public PanelConsulterProbleme() {
    	
    	//On met le panel à notre convenance
        this.setBackground(new Color(234, 232, 233));
        this.setLayout(null);
        
        TitledBorder titleInfo = new TitledBorder("Consulter Problème");
        titleInfo.setTitleColor(Color.BLUE);
        this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLUE));
        this.setBorder(BorderFactory.createTitledBorder(titleInfo));

        //Titre du problème
        titreProbleme = new JLabel();
        titreProbleme.setBounds(30, 20, 150, 15);
        add(titreProbleme);

        //Fonction objective
        fonctionobj = new JLabel("Fonction objective : ");
        fonctionobj.setBounds(30, 50, 150, 15);
        add(fonctionobj);

        //Libelle de fonction
        panfonc = new JPanel();
        libelleFonction = new JLabel("");
        libelleFonction.setSize(1070,30);
        panfonc.add(libelleFonction);
        panfonc.setBackground(Color.WHITE);
        JScrollPane scroll1 = new JScrollPane(panfonc);
        scroll1.setBounds(10, 70, 480, 50);
        scroll1.setPreferredSize(new Dimension(480, 50));
        scroll1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        add(scroll1);

        //Contraintes
        contraintes = new JLabel("Contraintes : ");
        contraintes.setBounds(30, 140, 150, 15);
        add(contraintes);

        //Table des contraintes
        pancontr = new JPanel();
        pancontr.setLayout(null);
        valuesTableDefaultModelContrainte = new DefaultTableModel();
        tableContrainte = new JTable(valuesTableDefaultModelContrainte);
        tableContrainte.setEnabled(false);
        valuesTableDefaultModelContrainte.setColumnIdentifiers(nomColonne);

        scroll1 = new JScrollPane(tableContrainte);
        scroll1.setBounds(10, 160, 480, 110);
        scroll1.setPreferredSize(new Dimension(240, 110));
        add(scroll1);

        //Résultat
        resultat = new JLabel("Résultat : ");
        resultat.setBounds(30, 290, 100, 15);
        add(resultat);

        //ComboBox pour le choix des résultats
        resultatBox = new JComboBox();
        resultatBox.setBounds(130, 290, 200, 15);
        remplirResultatBox();
        resultatBox.addItemListener(new EcouteurBoxResultat(this));
        add(resultatBox);
        
        //Panel résultat
        panres = new PanelResultat();
        panres.setPreferredSize(new Dimension(450, 300));
        panres.setBackground(Color.WHITE);
        scrollRes = new JScrollPane(panres);
        scrollRes.setBounds(10, 330, 480, 110);
        scrollRes.setPreferredSize(new Dimension(480, 110));
        scrollRes.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollRes.setVisible(false);
        add(scrollRes);

    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le JLabel qui est la fonction objective
     * 
     * @return la fonction objective
     */
	public JLabel getFonctionobj() {
		return fonctionobj;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le JLabel qui est le résultat
     * 
     * @return le résultat
     */
	public JLabel getResultat() {
		return resultat;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la JComboBox des résultats
     * 
     * @return la JComboBox des résultats
     */
	public JComboBox getResultatBox() {
		return resultatBox;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le panel des résultats
     * 
     * @return le panel des résultats
     */
	public PanelResultat getPanres() {
		return panres;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le scroll des résultats
     * 
     * @return le scroll des résultats
     */
	public JScrollPane getScrollRes() {
		return scrollRes;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le modèle de la JTable
     * 
     * @return le modèle de la JTable
     */
	public DefaultTableModel getValuesTableDefaultModelContrainte() {
		return valuesTableDefaultModelContrainte;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner un nouveau modèle de la JTable
	 * @param valuesTableDefaultModelContrainte nouveau modèle de la JTable
     */
	public void setValuesTableDefaultModelContrainte(
			DefaultTableModel valuesTableDefaultModelContrainte) {
		this.valuesTableDefaultModelContrainte = valuesTableDefaultModelContrainte;
	}
	
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le JLabel qui est le nom du problème.
     * <P>
     * @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 d'assigner un nouveau titre au problème 
     * 
     * @param titreProbleme nouveau titre au problème 
     * 
     */
	public void setTitreProbleme(JLabel titreProbleme) {
		this.titreProbleme = titreProbleme;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le label du libellé de fonction
     * 
     * @return libelle de la fonction
     * 
     */
	public JLabel getLibelleFonction() {
		return libelleFonction;
	}
	
	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de supprimer tous les éléments d'une JTable
     * 
     */
    public void RemoveAllElementsFromTable(DefaultTableModel dTM) {
        for (int j = dTM.getRowCount() - 1; j >= 0; j--) {
            dTM.removeRow(j);
        }
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de remplir la box des résultats
	 *
     */
    public final void remplirResultatBox(){
    	System.out.println("size of result : "+Application.getInstance().sizeOfResultat());
    	resultatBox.removeAllItems();
        resultatBox.addItem("--------------------------------------------");
        for(Resultat result : Application.getInstance().getResultats()){
        	resultatBox.addItem(result.getNomResultat());
        }
        resultatBox.setSelectedIndex(0);
    }
    
}
