package kerta.vue;



import kerta.modele.Resultat;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.*;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;

import fr.eisti.sql.DatabaseConnector;




public class FenetrePrincipale extends JFrame  {
	
	
	
	private static final long serialVersionUID = -447998472145987202L;
	

	// table d'association reliant les animaux et les boutons
	//HashMap<Graphe, JButton> associationsAnimauxBoutons;
	

	// liste des composant
	private JPanel jpnl_Graph;  // un panneau pour dessiner le graphique
	private JPanel jpnl_Buttons; // un panneau pour les boutons graphiques
	private JPanel jpnl_Sql;// un panneau pour la saisie de la requete sql
	private JLabel jlb_requete;//afficher 
	private JComboBox combo = new JComboBox(); // ajout d'un menu déroulant
	
	private JButton jbtn_pie;    // bouton pour graohique camambert
	private JButton jbtn_histogram; // bouton pour histogramme
	private JButton jbtn_execute_requete; // bouton pour executer requête
	private String option;
	

	public String getOption() {
		return option;
	}

	public void setOption(String option) {
		this.option = option;
	}

	// table d'association reliant les graphique et les boutons
	List<Resultat> listeRes;
	
	Connection connection;
	
	String titre;
	String nombre;
	

	public FenetrePrincipale(Connection conn) throws SQLException {  
		// appel au constructeur de la Resultat parente JFrame
		super("Outil de reporting");
		this.listeRes = new ArrayList<Resultat>();
		this.connection = conn;
		
		setSize(790, 480);  
	    setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
		setResizable(false); //On interdit la redimensionnement de la fenêtre
		
		jbtn_pie=new JButton("Camembert");
		jbtn_pie.setSize(20,50);

		jbtn_histogram=new JButton("Histogramme");
		jbtn_histogram.setSize(20,50);
		
		// Ajout des choix du menu déroulant
		combo.addItem("Répartition de la nature des établissements");
		combo.addItem("Répartition du nombre de noeuds créées par user");
		combo.addItem("Répartition des différents types de route");
		combo.addItem("Répartition des différents types de signalisations ou modifications de la route");
		combo.addItem("Répartition des différents types bâtiments scolaires");
;		

		
		
		// gestionnaire de placement de la fenetre principale
		// en GridLayout sur 2 colonnes
		// le 0 en 1er paramÃ¨tre prÃ©cise que le nb de lignes est extensible
		// on espace les composants de 5 en horizontal et 2 en vertical
		this.setLayout(new BorderLayout());
		
		//gestionnaire des placement des bouton 
		jpnl_Buttons = new JPanel();//new GridLayout(0,1));	
		jpnl_Buttons.setLayout(new GridLayout(10,1));
		jpnl_Buttons.add(jbtn_pie);
		jpnl_Buttons.add(jbtn_histogram);	
		
				
		//gestionnaire pour la requete sql	
		jlb_requete= new JLabel("Requete SQL : ");
		jbtn_execute_requete = new JButton("Execute"); 
		jpnl_Sql= new JPanel(new BorderLayout());
		jpnl_Sql.add(jlb_requete,BorderLayout.WEST);
		jpnl_Sql.add(combo,BorderLayout.CENTER);
		
		jpnl_Sql.add(jbtn_execute_requete ,BorderLayout.EAST);
	
		
		jpnl_Graph = new JPanel();
		//JPanel jtab = new JPanel();
	   
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		// this.add(jtab, BorderLayout.NORTH);
	     this.add(jpnl_Graph, BorderLayout.EAST);
	     this.add(jpnl_Buttons, BorderLayout.WEST);
	     this.add(jpnl_Sql, BorderLayout.SOUTH);
	     
	  
	     /***************ecouteurs evenements ************/
	     
	     // Ecouteur du bouton Camembert
	     
	 	jbtn_pie.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(!(listeRes.isEmpty()))
				  afficherPieGraphique(titre, listeRes);
				else 
				  JOptionPane.showConfirmDialog(null,
						   "Appuyer sur la touche Execute...","Merci d'entrer les données.",
						  javax.swing.JOptionPane.PLAIN_MESSAGE);
			}
		});
	     
	     
	 	// Ecouteur du bouton Histogramme
	 	
	 	jbtn_histogram.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(!(listeRes.isEmpty()))
				  afficherHistogrammGraphique(titre, listeRes);
				else
				{
					JOptionPane.showConfirmDialog(null,
							   "Appuyer sur la touche Execute...","Merci d'entrer les données.",
							  javax.swing.JOptionPane.PLAIN_MESSAGE);
				}
					
			}
		});
	 	
	 	
	 	// Ecouteur du bouton Executer
	     
	 	jbtn_execute_requete.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				
				// Action s'effectuant lorsque option 1 est sélectionnée
				
				if(combo.getSelectedItem().equals("Répartition de la nature des établissements")){
					while (listeRes.size()!=0) {
						listeRes.remove(0);
					}
					try (Statement state = connection.createStatement()) {
										
						String query1 = "select t2.v as Tata1, count(distinct t1.v) as Compte1 from tag t1, tag t2 where (t1.idT=t2.idT) AND (t2.v='restaurant' OR t2.v='university' OR t2.v='parking' OR t2.v = 'residential') group by t2.v";
												
						titre = "Répartition de la nature des établissements";
						nombre = "Nombre d'établissements";
					
						ResultSet result1 = state.executeQuery(query1);			
						int nombreLigne = 0;
						
						while(result1.next()){
							nombreLigne++;
							
						}
						
						Object [][] donnees = new Object[nombreLigne][2];
						String[] entete = {"Batiment","Occurences"};
						int parcours = 0;
						result1 = state.executeQuery(query1);
							while (result1.next()) {	
								
								String name = result1.getString("Tata1");
								int cpte = result1.getInt("Compte1");
								Resultat res1 = new Resultat(name, cpte);
								listeRes.add(new Resultat(name, cpte));
								System.out.println(res1.toString());	
								donnees[parcours][0] = result1.getString(1);
								donnees[parcours][1] = result1.getString(2);
								parcours++;
							} 
							JTable tableau = new JTable(donnees,entete);
							JScrollPane scroll = new JScrollPane(tableau);
							scroll.setPreferredSize(new Dimension(780,100));
							scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
							jpnl_Sql.add(scroll,BorderLayout.SOUTH);
							
							tableau.setVisible(true);
		} catch (SQLException e1 ) {
		// traiter l’exception
		}
				
				} 
				
				
				// Action s'effectuant lorsque option 2 est sélectionnée
	 	
				else if(combo.getSelectedItem().equals("Répartition du nombre de noeuds mis à jour par user")){
					while (listeRes.size()!=0) {
						listeRes.remove(0);
					}
					try (Statement state = connection.createStatement()) {						
						
						String query2 = "Select u.pseudo as Tata2, t.Compte2 from Utilisateur u, (Select idU, count (*) as Compte2 from Node group by idU) t where t.idu=u.idu";
												
						titre = "Répartition du nombre de noeuds créés par user";
						nombre = "Nombre de noeuds créés";
					
						ResultSet result2 = state.executeQuery(query2);			
						int nombreLigne = 0;
						while(result2.next()){
							nombreLigne++;
						}
						Object [][] donnees = new Object[nombreLigne][2];
						String[] entete = {"User","Occurences"};
						int parcours = 0;
						result2 = state.executeQuery(query2);
							while (result2.next()) {										
								String name = result2.getString("Tata2");
								int cpte = result2.getInt("Compte2");
								Resultat res2 = new Resultat(name, cpte);
								listeRes.add(new Resultat(name, cpte));
								System.out.println(res2.toString());	
								donnees[parcours][0] = result2.getString(1);
								donnees[parcours][1] = result2.getString(2);
								parcours++;
							} 
							JTable tableau = new JTable(donnees,entete);
							JScrollPane scroll = new JScrollPane(tableau);
							scroll.setPreferredSize(new Dimension(780,100));
							scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
							jpnl_Sql.add(scroll,BorderLayout.SOUTH);
							
							tableau.setVisible(true);
							
		} catch (SQLException e1 ) {
		// traiter l’exception
		}
									}
	 	
				
	
				

				
// Action s'effectuant lorsque option 5 est sélectionnée
				
				else if(combo.getSelectedItem().equals("Répartition des différents types de route")){
					while (listeRes.size()!=0) {
						listeRes.remove(0);
					}
				
					try (Statement state = connection.createStatement()) {						
												
						String query5 = "select distinct t2.k as Tata5, count(distinct t1.k) as Compte5 from tag t1, tag t2 where (t1.idT=t2.idT) AND (t2.k='highway' OR t2.k='oneway' OR t2.k='maxspeed' OR t2.k = 'bridge' OR t2.k = 'junction' OR t2.k = 'toll' OR t2.k = 'lanes' OR t2.k = 'cycleway') group by t2.k";
												
						titre = "Répartition des différents types de route";
						nombre = "Nombre d'occurrences";
					
						ResultSet result5 = state.executeQuery(query5);			
						int nombreLigne = 0;
						while(result5.next()){
							nombreLigne++;
						}
						Object [][] donnees = new Object[nombreLigne][2];
						String[] entete = {"Routes","Occurences"};
						int parcours = 0;
						result5 = state.executeQuery(query5);
							while (result5.next()) {										
								String name = result5.getString("Tata5");
								int cpte = result5.getInt("Compte5");
								Resultat res5 = new Resultat(name, cpte);
								listeRes.add(new Resultat(name, cpte));
								System.out.println(res5.toString());	
								donnees[parcours][0] = result5.getString(1);
								donnees[parcours][1] = result5.getString(2);
								parcours++;
							} 
							JTable tableau = new JTable(donnees,entete);
							JScrollPane scroll = new JScrollPane(tableau);
							scroll.setPreferredSize(new Dimension(780,100));
							scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
							jpnl_Sql.add(scroll,BorderLayout.SOUTH);
							
							tableau.setVisible(true);
			
		} catch (SQLException e1 ) {
		// traiter l’exception
		}
					}
				
				
// Action s'effectuant lorsque option 6 est sélectionnée
				
				else if(combo.getSelectedItem().equals("Répartition des différents types de signalisations ou modifications de la route")){
					while (listeRes.size()!=0) {
						listeRes.remove(0);
					}
				
					try (Statement state = connection.createStatement()) {						
												
						String query6 = "select distinct t2.v as Tata6, count(distinct t1.v) as Compte6 from tag t1, tag t2 where (t1.idT=t2.idT) AND (t2.v='traffic_signals' OR t2.v='mini_roundabout' OR t2.v='roundabout' OR t2.v = 'crossing' OR t2.v = 'barrier' OR t2.v = 'turning_circle') group by t2.v";
												
						titre = "Répartition des différents types de signalisations ou modifications de la route";
						nombre = "Nombre d'occurrences";
					
						ResultSet result6 = state.executeQuery(query6);			
						int nombreLigne = 0;
						while(result6.next()){
							nombreLigne++;
						}
						Object [][] donnees = new Object[nombreLigne][2];
						String[] entete = {"Signalisation","Occurences"};
						int parcours = 0;
						result6 = state.executeQuery(query6);
							while (result6.next()) {										
								String name = result6.getString("Tata6");
								int cpte = result6.getInt("Compte6");
								Resultat res6 = new Resultat(name, cpte);
								listeRes.add(new Resultat(name, cpte));
								System.out.println(res6.toString());	
								donnees[parcours][0] = result6.getString(1);
								donnees[parcours][1] = result6.getString(2);
								parcours++;
							} 
							JTable tableau = new JTable(donnees,entete);
							JScrollPane scroll = new JScrollPane(tableau);
							scroll.setPreferredSize(new Dimension(780,100));
							scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
							jpnl_Sql.add(scroll,BorderLayout.SOUTH);
							
							tableau.setVisible(true);
			
		} catch (SQLException e1 ) {
		// traiter l’exception
		}
					}
				
				
// Action s'effectuant lorsque option 7 est sélectionnée
				
				else if(combo.getSelectedItem().equals("Répartition des différents types de bâtiments scolaires")){
					while (listeRes.size()!=0) {
						listeRes.remove(0);
					}
				
					
					try (Statement state = connection.createStatement()) {						
												
						String query7 = "select distinct t2.v as Tata7, count(distinct t1.v) as Compte7 from tag t1, tag t2 where (t1.idT=t2.idT) AND (t2.v='university' OR t2.v='college' OR t2.v='school') group by t2.v";
												
						titre = "Répartition des différents types bâtiments scolaires";
						nombre = "Nombre d'occurrences";
					
						ResultSet result7 = state.executeQuery(query7);
						int nombreLigne = 0;
						while(result7.next()){
							nombreLigne++;
						}
						Object [][] donnees = new Object[nombreLigne][2];
						String[] entete = {"Batiment","Occurences"};
						int parcours = 0;
						result7 = state.executeQuery(query7);
							while (result7.next()) {										
								String name = result7.getString("Tata7");
								int cpte = result7.getInt("Compte7");
								Resultat res7 = new Resultat(name, cpte);
								listeRes.add(new Resultat(name, cpte));
								System.out.println(res7.toString());	
								donnees[parcours][0] = result7.getString(1);
								donnees[parcours][1] = result7.getString(2);
								parcours++;
							} 
							JTable tableau = new JTable(donnees,entete);
							JScrollPane scroll = new JScrollPane(tableau);
							scroll.setPreferredSize(new Dimension(780,100));
							scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
							jpnl_Sql.add(scroll,BorderLayout.SOUTH);
							
							tableau.setVisible(true);
			
		} catch (SQLException e1 ) {
		// traiter l’exception
		}
					}
				

			
		} });
	 	
	 	
	 	
	 	
	 	combo.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e){
			//La méthode retourne un Object puisque nous passons des Object dans une liste
	 	      //Il faut donc utiliser la méthode toString() pour retourner un String (ou utiliser un cast)
		setOption(combo.getSelectedItem().toString());
		}
	});
 	
	 	
	 	
	 	
	     // un evenement particulier, la fermeture de la fenetre principale
			//this.setDefaultCloseOperation(EXIT_ON_CLOSE);	
		addWindowListener(new WindowAdapter() {       
				       public void windowClosing(WindowEvent e) { 
				    	  DatabaseConnector.closeConnection();
					      dispose();        
					      System.exit(0);  
					     
				      }      
		}
	);
	}		
			
			
			
		
	/****************histogramme****************/
	public void afficherHistogrammGraphique(String titreHist, List<Resultat> listeRes){
	DefaultCategoryDataset dataset = new DefaultCategoryDataset();  
	for (Resultat r : listeRes){
		  dataset.addValue(new Integer(r.getCpte()), r.getName(),"");   
		  dataset.addValue(new Integer(r.getCpte()), r.getName(),"");  
		  dataset.addValue(new Integer(r.getCpte()), r.getName(),"");   
		}
	    JFreeChart barChart = ChartFactory.createBarChart(titreHist, "",       
			nombre, dataset, PlotOrientation.VERTICAL, true, true, false);  	
			ChartPanel cPane2 = new ChartPanel(barChart); 
			jpnl_Graph.removeAll();
			jpnl_Graph.add(cPane2);
			this.pack();
	}
	/**************************************************************/		
			
	/********** camembert **********/
	public void afficherPieGraphique(String titreCam, List<Resultat> listeRes){
		DefaultPieDataset pieDataset = new DefaultPieDataset(); 
		
		for (Resultat r : listeRes){
		  pieDataset.setValue(r.getName(), new Integer(r.getCpte()));   
		  pieDataset.setValue(r.getName(), new Integer(r.getCpte()));  
		  pieDataset.setValue(r.getName(), new Integer(r.getCpte()));   
		}	   
		JFreeChart pieChart = ChartFactory.createPieChart(titreCam,pieDataset, true, true, false);     
		ChartPanel cPane1 = new ChartPanel(pieChart);
		jpnl_Graph.removeAll();
		jpnl_Graph.add(cPane1);		
		this.pack();
	}
	/*********************************************/
	
	
	
	
	/*********************** Action du choix de l'option ******/
	
	/* public void appel (JComboBox combo) {
		if(this.option.equals("Option 1")){
			afficherHistogrammGraphique(listeRes);
			afficherPieGraphique(listeRes);
			
		}
	}*/

}