/**
 *
 * <p>Titulo: Servidor de respuestas a preguntas</p>
 * <p>Descripcion: Este programa permite crear un grafico de barras
 * </p>
 * @author Diego Gonzalez Barrientos
 * @version 1.0
 */


//Paquete en el que se encapsula todo el codigo del servidor

package servidorpreguntas;

//Paquetes usados por el programa
import java.awt.Color;
import java.awt.Paint;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;
import java.util.Vector;
import java.lang.Comparable;
/**Clase que genera grafico de barras
 *
 */
public class BarChart extends ApplicationFrame {

    /**
     * Retorna un color diferente por cada item en una serie.
     */
    class CustomRenderer extends BarRenderer {

        /** Los colores. */
        private Paint[] colors;

        /**
         * Crea un nuevo arreglo de colores.
         *
         * @param colors  los colores.
         */
        public CustomRenderer(final Paint[] colors) {
            this.colors = colors;
        }

        /**
         * Returns the paint for an item.  Overrides the default behaviour inherited from
         * AbstractSeriesRenderer.
         *
         * @param row  the series.
         * @param column  the category.
         *
         * @return The item color.
         */
        public Paint getItemPaint(final int row, final int column) {
            return this.colors[column % this.colors.length];
        }
    }

    /**
     * Crea un nuevo grafico de barra.
     *
     * @param title  El titulo del grafico.
	  *@param contador mantiene contador de respuestas de la alternativas
	  *@param alternativa_correcta 
	  *@param numero_alternativas
     */
    public BarChart(final String title, int[] contador, int alternativa_correcta, int numero_alternativas) {
        super(title);
        final CategoryDataset dataset = createDataset(contador,alternativa_correcta,numero_alternativas);
        final JFreeChart chart = createChart(dataset,title);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }

    /**
     * Crea un conjunto de datos.
     * @param contador
	  *@param alternativa_correcta
	  *@param numero_alternativas
     * @return un conjunto de datos.
     */
    private CategoryDataset createDataset(int[] contador, int alternativa_correcta, int numero_alternativas) {
	     final double[][] data = new double[1][contador.length];
		  String[] nombre_columna = new String[contador.length];
		  for (int i = 0; i< contador.length; i++){
		     data[0][i] = (double)contador[i];
			  if (i == (alternativa_correcta - 1) ) nombre_columna[i] = new String (SPP_Server.alt_arreglo[i] + ", alternativa correcta");
		     else nombre_columna[i] = SPP_Server.alt_arreglo[i];
		  }
		    //System.out.println(nombre_columna.length + " " + data.length);
		    return DatasetUtilities.createCategoryDataset(new String[]{"a"},nombre_columna,data);
    }
    
    /**
     * Creates a sample chart.
     * 
     * @param dataset  the dataset.
     * 
     * @return a sample chart.
     */
    private JFreeChart createChart(final CategoryDataset dataset, String title) {

        final JFreeChart chart = ChartFactory.createBarChart(
            title,       // chart title
            "Alternativa",               // domain axis label
            "Veces Contestada",                  // range axis label
            dataset,                  // data
            PlotOrientation.VERTICAL, // the plot orientation
            false,                    // include legend
            true,
            false
        );

        chart.setBackgroundPaint(Color.lightGray);

        // get a reference to the plot for further customisation...
        final CategoryPlot plot = chart.getCategoryPlot();
        plot.setNoDataMessage("NO DATA!");

        final CategoryItemRenderer renderer = new CustomRenderer(
            new Paint[] {Color.red, Color.blue, Color.green,
                Color.yellow, Color.orange, Color.cyan,
                Color.magenta, Color.blue}
        );
        renderer.setItemLabelsVisible(true);
        final ItemLabelPosition p = new ItemLabelPosition(
            ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, 45.0
        );
        renderer.setPositiveItemLabelPosition(p);
        plot.setRenderer(renderer);

        // change the margin at the top of the range axis...
        final ValueAxis rangeAxis = plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        rangeAxis.setAutoRange(true);
        return chart;

    }
    
}