package demoGrafici;

import org.jfree.data.xy.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.data.category.*;
import org.jfree.data.general.*;

import java.io.*;

public class Grafici
{

	static void creaGrafo1()
	{
		XYSeriesCollection dataSet = caricaDati1();
		
		// creo l'oggetto JFreeChart col metodo statico dedicato
		// per il tipo di grafico in esame
		JFreeChart grafo1 = ChartFactory.createXYLineChart("Grafo1", "Giorni di Gennaio", "Gradi (C°)",
							dataSet, PlotOrientation.VERTICAL, 
							true, false, false );


		// modifico il range di valori sull'asse delle ordinate
		/*
		XYPlot plot = grafo1.getXYPlot();
		ValueAxis asseY = plot.getRangeAxis();
		asseY.setRange(-5, 20);
		*/

		// creo un oggetto ChartFrame per visualizzare finalmente il grafico
		// ChartFrame eredita da java.awt.Frame ed è quindi trattabile in seguito
		// con le normali primitive grafiche fornite dal package java.awt
		ChartFrame frame1 = new ChartFrame("Esempio1", grafo1);
		// scelgo la dimensione in pixel della finestra
		frame1.setSize(400,350);
		// e la visualizzo
		frame1.setVisible(true);

	}


	static void creaGrafo2()
	{
		// creo un CategoryDataset
		DefaultCategoryDataset dataSet = caricaDati2();

		// creo l'oggetto JFreeChart col metodo statico dedicato
		// per il tipo di grafico in esame
		JFreeChart grafo = ChartFactory.createBarChart("Entrate/Uscite", "Mesi", "Euro", dataSet, PlotOrientation.VERTICAL, true, false, false);
		
		// creo un oggetto ChartFrame per visualizzare finalmente il grafico
		// ChartFrame eredita da java.awt.Frame ed è quindi trattabile in seguito
		// con le normali primitive grafiche fornite dal package java.awt
		ChartFrame frame = new ChartFrame("Esempio2", grafo);
		// scelgo la dimensione in pixel della finestra
		frame.setSize(400,350);
		// e la visualizzo
		frame.setVisible(true);
	}

	static void creaGrafo3()
	{
		DefaultXYZDataset dataSet = caricaDati3();
		JFreeChart grafo = ChartFactory.createBubbleChart("Vendite", "Italia", "Estero", dataSet, PlotOrientation.VERTICAL, true, false, false);
		XYPlot plot = grafo.getXYPlot();

		// modifico il range di valori sull'asse delle ordinate
		/*
		ValueAxis asseY = plot.getRangeAxis(0);
		asseY.setRange(0, 400);
		*/
		
		ChartFrame frame = new ChartFrame("Esempio3", grafo);
		frame.setSize(400,350);
		frame.setVisible(true);
	}

	
	static void esercizio()
	{
		DefaultPieDataset dataSet = caricaDatiEsercizio();
		
		JFreeChart grafo = ChartFactory.createPieChart("Fonti energetiche", dataSet, true, false, false);
		
		
		ChartFrame frame = new ChartFrame("Esercizio", grafo);
		frame.setSize(400,350);
		frame.setVisible(true);
	}
	
	static XYSeriesCollection caricaDati1()
	{
		String s, a[];
		
		// creo la serie di dati per le temperature massime
		XYSeries serieMax = new XYSeries("Massima");
		// creo la serie di dati per le temperature minime
		XYSeries serieMin = new XYSeries("Minima");
		
		try
		{
			FileReader in = new FileReader("esempio1.dat");
			BufferedReader reader = new BufferedReader(in);
			
			while (reader.ready())
			{
				s = reader.readLine();
				if (s.length() > 0 && s.charAt(0) != '#')
				{
					// la funzione split suddivide la stringa s in
					// sottostringhe riconoscibili da un delimitatore
					// (in questo caso una tabulazione)
					a = s.split("\t");
					serieMin.add(Double.parseDouble(a[0]), Double.parseDouble(a[1]));
					serieMax.add(Double.parseDouble(a[0]), Double.parseDouble(a[2]));
				}
			}

			reader.close();
			in.close();
		}
		catch (IOException ioe)
		{
			System.out.println(ioe.getMessage());
		}
		// creo il dataset (con una o più serie di dati), che rappresenta
		// la collezione dei dati da rappresentare
		XYSeriesCollection dataSet = new XYSeriesCollection();
		dataSet.addSeries(serieMax);
		dataSet.addSeries(serieMin);

		return dataSet;
	}

	static DefaultCategoryDataset caricaDati2()
	{
		String s, a[];
		DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
		try
		{
			FileReader in = new FileReader("esempio2.dat");
			BufferedReader reader = new BufferedReader(in);
			
			while (reader.ready())
			{
				s = reader.readLine();
				if (s.length() > 0 && s.charAt(0) != '#')
				{
					// la funzione split suddivide la stringa s in
					// sottostringhe riconoscibili da un delimitatore
					// (in questo caso una tabulazione)
					a = s.split("\t");
					// a[0] mese
					// a[1] entrate
					// a[2] uscite
					dataSet.addValue(Double.parseDouble(a[1]), "Entrate", a[0]);
					dataSet.addValue(Double.parseDouble(a[2]), "Uscite", a[0]);
				}
			}

			reader.close();
			in.close();
		}
		catch (IOException ioe)
		{
			System.out.println(ioe.getMessage());
		}
		return dataSet;
	}
	
	static DefaultXYZDataset caricaDati3()
	{

		DefaultXYZDataset dataSet = new DefaultXYZDataset();

		String s, a[];
		double d[][];
		double tot, max = 0, t;
		
		try
		{
			FileReader in = new FileReader("esempio3.dat");
			BufferedReader reader = new BufferedReader(in);
		
			// scorro tutto il file per determinare il valore massimo del terzo campo
			// (Serve per la successiva normalizzazone dei valori)
			while (reader.ready())
			{
				s = reader.readLine();
				if (s.length() > 0 && s.charAt(0) != '#')
				{
					a = s.split("\t");
					tot = Double.parseDouble(a[1]) + Double.parseDouble(a[2]);
					if (tot > max) max = tot;
				}
			}

			reader.close(); in.close();
			
			// inizio una nuova scansione del file per caricare i dati
			in = new FileReader("esempio3.dat");
			reader = new BufferedReader(in);
			
			while (reader.ready())
			{
				s = reader.readLine();
				if (s.length() > 0 && s.charAt(0) != '#')
				{
					d = new double[3][1];
					// la funzione split suddivide la stringa s in
					// sottostringhe riconoscibili da un delimitatore
					// (in questo caso una tabulazione)
					a = s.split("\t");
					d[0][0] = Double.parseDouble(a[1]);
					d[1][0] = Double.parseDouble(a[2]);
					// sommo le vendite di italia e estero
					tot = d[0][0] + d[1][0];
					/*
					 * Normalizzo la dimensione delle bolle nel range [0-M] con M che vale 1/5 del valore massimo
					 * rilevato tra i dati
					 * Questa operazione va compiuta perchè la dimensione delle bolle di default
					 * è proporzionale ai valori sugli assi.
					 * A noi interessa la dimensione relativa delle bolle per l'immediata comparazione
					 */

					t = (max/5) * tot / max;
					d[2][0] = t;
					dataSet.addSeries(a[0], d);
				}
			}
			
			reader.close();
			in.close();
		}
		catch (IOException ioe)
		{
			System.out.println(ioe.getMessage());
		}
		return dataSet;
	}
	
	static DefaultPieDataset caricaDatiEsercizio()
	{
		String s, a[];
		DefaultPieDataset dataSet = new DefaultPieDataset();
		
		try
		{
			FileReader in = new FileReader("esercizio.dat");
			BufferedReader reader = new BufferedReader(in);

			while (reader.ready())
			{
				s = reader.readLine();
				if (s.length() > 0 && s.charAt(0) != '#')
				{
					a = s.split("\t");
					dataSet.setValue(a[0] + " " +  a[1] + "%", Double.parseDouble(a[1]));
				}
			}

			reader.close();
			in.close();
		}
		catch (IOException ioe)
		{
			System.out.println(ioe.getMessage());
		}

		return dataSet;
	}
	
	public static void main (String[] args)
	{
		creaGrafo1();
		creaGrafo2();
		creaGrafo3();
		esercizio();
	}
}
