/**
 * 
 */
package View;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JComboBox;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import Model.Classification;
import Model.Courbe;
import Model.IPoint;
import Model.Model;
/**
 * @author Christophe HAVARD
 *
 */
public class OngletInfos extends JPanel implements Observer {

	private static final long serialVersionUID = 1L;
	private JPanel container;
	private Model model;
	private JLabel label = new JLabel("Infos disponibles : ");
	private static String FAFR = new String("Fausses acceptations/Faux refus");
	private static String GRAPH_PRESSION = new String("Graphe de la Pression");
	private static String ARBRE_DECISION = new String("Arbre de Décisions");
	private static String RESULTATS_WAKA = new String("Resultats");
	private List<IPoint> lastUserAcquisition = null;

	/**
	 * reprÃ©sente les differents choix d'info que l'utilisateur peut choisir au depart (ex : nombre de Fausses
	 * acceptations, difference de pression, etc
	 */
	private JComboBox<String> listInfosDispo;
	private JPanel infos;
	private OngletIdentification ongletIdentification;

	/**
	 * @param model
	 * @param onglet2 
	 */
	public OngletInfos(Model model, OngletIdentification onglet2) {
		container = new JPanel();
		container.setLayout(new BorderLayout());
		this.model = model;
		this.ongletIdentification = onglet2;
		// on s'abonne a SignatureObservable pour savoir si un user a realise une signature
		SignatureObservable.Instance().addObserver(this);
		// ---- liste deroulante
		//creation de la liste deroulante
		listInfosDispo = new JComboBox<String>();
		listInfosDispo.addItem(FAFR);
		listInfosDispo.addItem(GRAPH_PRESSION);
		listInfosDispo.addItem(ARBRE_DECISION);
		listInfosDispo.addItem(RESULTATS_WAKA);
		
		//Ajout du listener
        listInfosDispo.addActionListener(new ItemAction());
        listInfosDispo.setPreferredSize(new Dimension(150,20));
        //on rajoute un conteneur ou on met le label et la combobox
        JPanel top = new JPanel();
        top.add(label);
        top.add(listInfosDispo);
        //on rajoute tout Ã§a au conteneur global
        container.add(top, BorderLayout.NORTH);
        
        // ---- conteneur des infos
        infos = new JPanel();
        container.add(infos, BorderLayout.SOUTH);
        this.add(container);
	}

    
    class ItemAction implements ActionListener{

            public void actionPerformed(ActionEvent e) {
                    String selectedItem = (String) listInfosDispo.getSelectedItem();
                    if(selectedItem.compareToIgnoreCase(FAFR) == 0){
                    	infos.removeAll();
                    	infos.revalidate();
                    	int totalLogs = model.getTotalNbOfLogs();
                    	int fa = model.falseApprobRate();
                    	int fr = model.falseRefusalRate();
                    	JLabel totalLabel = new JLabel("Total logs : ");
                    	JLabel totalValue = new JLabel(String.valueOf(totalLogs));
                    	JLabel faLabel = new JLabel("Fausses acceptations : ");
                    	JLabel faValue = new JLabel(String.valueOf(fa) + " %");
                    	JLabel frLabel = new JLabel("Faux refus : ");
                    	JLabel frValue = new JLabel(String.valueOf(fr) + " %");
                    	infos.add(totalLabel);
                    	infos.add(totalValue);
                    	infos.add(faLabel);
                    	infos.add(faValue);
                    	infos.add(frLabel);
                    	infos.add(frValue);
                    	infos.repaint();
                    	infos.revalidate();
                    	
                    } else if(selectedItem.compareToIgnoreCase(GRAPH_PRESSION) == 0 && lastUserAcquisition != null){
                    	infos.removeAll();
                    	infos.revalidate();
                    	
                    	showGraphPression();
                    	
                    	infos.repaint();
                    	infos.revalidate();
                    }else if(selectedItem.compareToIgnoreCase(ARBRE_DECISION) == 0 && lastUserAcquisition != null){
                    	infos.removeAll();
                    	infos.revalidate();
                    	
                    	JEditorPane arbre = new JEditorPane();
                    	arbre.setPreferredSize(new Dimension(580,580));
                    	arbre.setEditable(false);
                    	String fluchte = Classification.getDecisionTree();
                    	System.out.println(fluchte);
                    	arbre.setText(fluchte);
                    	infos.add(arbre);
                    	
                    	infos.repaint();
                    	infos.revalidate();
                    	
                    }else if(selectedItem.compareToIgnoreCase(RESULTATS_WAKA) == 0 && lastUserAcquisition != null){
                    	infos.removeAll();
                    	infos.revalidate();
                    	
                    	JEditorPane resultats = new JEditorPane();
                    	resultats.setPreferredSize(new Dimension(580,580));
                    	resultats.setEditable(false);
                    	String fluchte = Classification.getResults();
                    	try {
							fluchte = fluchte + Classification.getMatrix();
						} catch (Exception e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
                    	System.out.println(fluchte);
                    	resultats.setText(fluchte);
                    	infos.add(resultats);
                    	
                    	infos.repaint();
                    	infos.revalidate();
                    	
                    }else {
                    	infos.removeAll();
                    	infos.revalidate();
                    	
                    	JEditorPane arbre = new JEditorPane();
                    	arbre.setPreferredSize(new Dimension(580,100));
                    	arbre.setEditable(false);
                    	String fluchte = "Veuillez vous identifier pour pouvoir afficher des statistiques";
                    	System.out.println(fluchte);
                    	arbre.setText(fluchte);
                    	infos.add(arbre);
                    	
                    	infos.repaint();
                    	infos.revalidate();
                    	
                    }
            }
              
    }
    
	/**
	 * @return 
	 * 
	 */
	private void showGraphPression() {
		System.out.println("ongletIdentification.getUser()" + ongletIdentification.getUser());
		System.out.println("this.lastUserAcquisition" + this.lastUserAcquisition.size());
		if(ongletIdentification.getUser() != null && this.lastUserAcquisition != null && !this.lastUserAcquisition.isEmpty()){
			//--- on creer le DataSet pour les data qu'on veut afficher
	        final XYSeries refChris = model.buildPressureReferenceDataset(ongletIdentification.getUser(), "Pression référence");
	        final XYSeries lastAcquisition = model.buildPressureDataset(this.lastUserAcquisition, "Dernière acquisition");
	        // on met tout ca dans le dataset a afficher
	        final XYSeriesCollection dataset = new XYSeriesCollection();
	        dataset.addSeries(refChris);
	        dataset.addSeries(lastAcquisition);
	        
	        // --- on creer la courbe correspondante
	        Courbe courbe = new Courbe("Statistiques", dataset, "Evolution pression", "temps", "intensité");
	        courbe.affiche(infos);
		}else {
			System.out.println("Impossible d'afficher le graphe");
		}
		
    }

	/* (non-Javadoc)
	 * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void update(Observable o, Object arg) {
		if(o instanceof SignatureObservable && arg instanceof List<?>){
			this.lastUserAcquisition = (List<IPoint>) arg;
		}
		
	}
		
	} 

