/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package Graficos;

import java.awt.Color;
import java.awt.Font;
import javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;
import org.jfree.chart.*;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.VerticalAlignment;

public class BarrasDoble {

    public BarrasDoble(String title, JPanel panel, DefaultTableModel modelo) {
        JFreeChart chart = createChart(title, modelo);
        panel.add(new ChartPanel(chart));
        panel.invalidate();
        panel.validate();
    }

    private JFreeChart createChart(String title, DefaultTableModel modelo) {

        CategoryDataset categorydataset1 = crearDataset1(modelo);   // barras
        CategoryDataset categorydataset2 = crearDataset2(modelo);   // linea (máxmimos)

        JFreeChart jfreechart = ChartFactory.createBarChart3D(title, "", "Tiempo", categorydataset1, PlotOrientation.VERTICAL, true, true, false);
        jfreechart.setBackgroundPaint(new Color(204, 255, 204));

        CategoryPlot plot = jfreechart.getCategoryPlot();
        plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
        plot.setRangeAxisLocation(AxisLocation.TOP_OR_LEFT);
        plot.setNoDataMessageFont(new java.awt.Font("MS Sans Serif", 0, 20));
        plot.setNoDataMessage("Sin datos");
        plot.getRangeAxis().setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        plot.setDataset(1, categorydataset2);
        plot.mapDatasetToRangeAxis(1, 0);
        plot.clearAnnotations();

        CategoryItemRenderer render = plot.getRenderer();
        render.setBaseItemLabelsVisible(false);
        render.setItemLabelsVisible(false);
        Datos.Variables vars = Datos.Variables.getVariables();
        for (int i = 0; i < categorydataset1.getRowCount(); i++) {
            render.setSeriesPaint(i, vars.colores.get(categorydataset1.getRowKey(i)));
        }

        LineAndShapeRenderer linerenderer3d = new LineAndShapeRenderer();
        linerenderer3d.setSeriesPaint(0, Color.BLACK);
        linerenderer3d.setToolTipGenerator(new StandardCategoryToolTipGenerator());

        plot.setRenderer(1, linerenderer3d);
        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
        jfreechart.setBackgroundPaint(Color.WHITE);
        TextTitle subtitulo = new TextTitle("Tiempo expresado en minutos");
        subtitulo.setFont(new java.awt.Font("Serif", Font.PLAIN, 10));
        subtitulo.setPosition(RectangleEdge.TOP);
        subtitulo.setVerticalAlignment(VerticalAlignment.CENTER);
        jfreechart.addSubtitle(subtitulo);
        jfreechart.addSubtitle(subtituloAdmon());
        return jfreechart;
    }

    private TextTitle subtituloAdmon() {
        String Admo = Datos.Variables.getVariables().getNombreAdmon();
        TextTitle subtitulo = new TextTitle(Admo);
        subtitulo.setFont(new java.awt.Font("Serif", 0, 13));
        subtitulo.setPosition(RectangleEdge.TOP);
        subtitulo.setVerticalAlignment(VerticalAlignment.CENTER);
        return subtitulo;
    }

    private static CategoryDataset crearDataset1(DefaultTableModel modelo) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < modelo.getRowCount(); i++) {
            String Serie = modelo.getValueAt(i, 0).toString();
            Number Valor = (Number) modelo.getValueAt(i, 1);
            dataset.setValue(new Double(Valor.doubleValue()), Serie, "");
        }
        return dataset;
    }

    private static CategoryDataset crearDataset2(DefaultTableModel modelo) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        String Texto = modelo.getColumnName(3);
        for (int i = 0; i < modelo.getRowCount(); i++) {
            String Serie = modelo.getValueAt(i, 0).toString();
            Number Valor = (Number) modelo.getValueAt(i, 3);
            dataset.setValue(new Double(Valor.doubleValue()), Texto, Serie);
        }
        return dataset;
    }
}
