/* 
* 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 javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.*;
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 BarrasConCategorias {

    private DefaultTableModel modelo;

    public BarrasConCategorias(final String title, JPanel panel, DefaultTableModel modelo, int resumen) {
        this.modelo = modelo;
        final CategoryDataset dataset1 = crearDataset2Campos(modelo);
        CrearBarrasConCategorias(title, panel, dataset1, resumen, true);
    }

    public BarrasConCategorias(final String title, JPanel panel, DefaultTableModel modelo, int resumen, String cadena2) {
        this.modelo = modelo;
        CrearBarrasConCategorias(title, panel, crearDatasetCampos(modelo), resumen, false);
    }

    public void CrearBarrasConCategorias(final String title, JPanel panel, CategoryDataset dataset1, int resumen, boolean leyenda) {
        final JFreeChart chart = ChartFactory.createBarChart3D(
                title, // chart title
                "", // domain axis label
                "Valores", // range axis label
                dataset1, // data
                PlotOrientation.VERTICAL,
                leyenda, // include legend
                true,
                false);

        chart.setBackgroundPaint(Color.WHITE);
        final CategoryPlot plot = chart.getCategoryPlot();
        plot.setDomainAxisLocation(AxisLocation.TOP_OR_LEFT);
        plot.setNoDataMessageFont(new java.awt.Font("MS Sans Serif", 0, 20));
        plot.setNoDataMessage("Sin datos");
        
        Datos.Variables vars = Datos.Variables.getVariables();
        org.jfree.chart.renderer.category.CategoryItemRenderer rend = plot.getRenderer(0);
        for(int i=0; i< dataset1.getRowCount(); i++) {
            rend.setSeriesPaint(i, vars.colores.get(dataset1.getRowKey(i)));
        }

        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        chart.addSubtitle(subtituloAdmon());

        if (resumen > -1) {
            chart.addSubtitle(resumen1(resumen));
        }
        panel.add(new ChartPanel(chart));
     panel.invalidate();
        panel.validate();
    }

    private TextTitle resumen1(int campo) {
        String total = Sumar(campo);
        TextTitle subtitulo = new TextTitle(total);
        subtitulo.setFont(new java.awt.Font("Serif", 0, 13));
        subtitulo.setPosition(RectangleEdge.BOTTOM);
        subtitulo.setVerticalAlignment(VerticalAlignment.CENTER);
        return subtitulo;
    }

    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 String Sumar(int campo) {
        int Valor = 0;
        for (int i = 0; i < modelo.getRowCount(); i++) {
            Valor = Valor + ((Number) modelo.getValueAt(i, campo)).intValue();
        }
        return "Total: " + Valor;
    }

    public CategoryDataset crearDatasetCampos(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, 2);
            dataset.setValue(new Double(Valor.doubleValue()), Serie, "");
        }
        return dataset;
    }

    private CategoryDataset crearDataset2Campos(DefaultTableModel modelo) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        int x = modelo.getColumnCount();
        if (x == 2) {
            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, "");
            }
        }
        if (x == 4) {
            for (int i = 0; i < modelo.getRowCount(); i++) {
                String Serie = modelo.getValueAt(i, 0).toString();
                String Categoria = modelo.getValueAt(i, 1).toString();
                Number Valor = (Number) modelo.getValueAt(i, 3);
                dataset.setValue(new Double(Valor.doubleValue()), Serie, Categoria);
            }
        }
        return dataset;
    }
}

