/*
 * ReportDataAccess.java
 *
 * Created on 8 de octubre de 2004, 06:43 PM
 */

package com.fenalco.entities;

import java.sql.Date;
import java.sql.Time;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import com.fenalco.utilities.database.QueryException;
import com.fenalco.utilities.database.SQLUtilities;


/**
 * 
 * @author admin
 */
public class ReportDataAccess
{
    
        private Vector report;
        
        private int quantity;
        
        private double total;

	/** Creates a new instance of ReportDataAccess */
	public ReportDataAccess()
	{
            
            this.report = new Vector();
            
	}

	public static Vector topReportBuilder(int companyId, int companyTypeId, int sort, int numRows, int reportType, Date startDate, Date endDate){
            Vector reportList = new Vector();
            Vector row;
            Vector result = new Vector();
            Hashtable aux = new Hashtable();
            String sql = new String("");
            
            String order;
            if( sort==0 ){
                order = "ORDER BY total DESC ";
            }else{
                order = "ORDER BY total ASC ";
            }
            
            String date;
            if( startDate.getTime() > 0 && endDate.getTime() > 0){
                date = " (pedido.pedi_fecha BETWEEN \'"+startDate+"\' AND \'"+endDate+"\') ";
            }else if( startDate.getTime() > 0 ){
                date = " (pedido.pedi_fecha >= \'"+startDate+"\') ";
            }else if( endDate.getTime() > 0 ){
                date = " (pedido.pedi_fecha <= \'"+endDate+"\') ";
            }else{
                date = " 1=1 ";
            }
            
            
            //Top Productos
            if( reportType == 1)
            {
                sql = sql.concat("SELECT producto_pedido.prod_prov_id, producto_proveedor.prod_prov_descripcion_corta,"+ 
                                 "SUM(producto_pedido.prod_pedi_precio * producto_pedido.prod_pedi_cantidad) as total ");
                //Minorista
                if( companyTypeId == 1)
                {
                   sql = sql.concat("FROM producto_proveedor, producto_pedido, pedido, establecimiento ");
                   
                   sql = sql.concat("WHERE producto_proveedor.prod_prov_id = producto_pedido.prod_prov_id AND "+
                                    "producto_pedido.pedi_id = pedido.pedi_id AND "+
                                    "pedido.esta_id = establecimiento.esta_id AND "+
                                    "establecimiento.empr_id = "+companyId+" AND "+
                                    "(pedido.esta_pedi_id = 3 OR pedido.esta_pedi_id = 4) AND "+date);
                   
                   sql = sql.concat("GROUP BY producto_pedido.prod_prov_id, producto_proveedor.prod_prov_descripcion_corta "+order+";");
                   //sql = sql.concat("GROUP BY producto_pedido.prod_prov_id, producto_proveedor.prod_prov_descripcion_corta ");
                   
                   //sql = sql.concat("LIMIT "+numRows+" "+order+";");
                }
                else
                {
                   sql = sql.concat("FROM producto_proveedor, producto_pedido, pedido ");
                   
                   sql = sql.concat("WHERE producto_proveedor.prod_prov_id = producto_pedido.prod_prov_id AND "+
                                    "producto_pedido.pedi_id = pedido.pedi_id AND "+
                                    "(pedido.esta_pedi_id = 3 OR pedido.esta_pedi_id = 4) AND "+
                                    " producto_proveedor.empr_id = "+companyId+" AND "+date);
                   
                   sql = sql.concat("GROUP BY producto_pedido.prod_prov_id, producto_proveedor.prod_prov_descripcion_corta "+order +";");
                   //sql = sql.concat("GROUP BY producto_pedido.prod_prov_id, producto_proveedor.prod_prov_descripcion_corta ");
                   
                   //sql = sql.concat("LIMIT "+numRows+" "+order +";");
                   
                }
            }
            else
            {
                //Top Proveedores / Minoristas
                sql = sql.concat("SELECT empresa.empr_id, empresa.empr_nombre_comercial, SUM(producto_pedido.prod_pedi_precio * producto_pedido.prod_pedi_cantidad) as total ");
                sql = sql.concat("FROM pedido, establecimiento, empresa, producto_pedido ");
                
                if( companyTypeId == 1)
                {
                    
                    sql = sql.concat("WHERE pedido.esta_id = establecimiento.esta_id AND " +
                                     "pedido.empr_id = empresa.empr_id AND " +
                                     "pedido.pedi_id = producto_pedido.pedi_id AND " + 
                                     "establecimiento.empr_id = "+companyId+" AND "+
                                     "(pedido.esta_pedi_id = 3 OR pedido.esta_pedi_id = 4) AND "+date);
                    
                    sql = sql.concat("GROUP BY empresa.empr_id, empresa.empr_nombre_comercial "+ order +";");
                    //sql = sql.concat("GROUP BY empresa.empr_id, empresa.empr_nombre_comercial ");
                    
                    //sql = sql.concat("LIMIT "+numRows+" "+order+";");
                }
                else
                {
                    //Top Clientes / Proveedor
                    sql = sql.concat("WHERE pedido.esta_id = establecimiento.esta_id AND " +
                                     "establecimiento.empr_id = empresa.empr_id AND " +
                                     "pedido.pedi_id = producto_pedido.pedi_id AND " + 
                                     "pedido.empr_id = "+companyId+" AND "+
                                     "(pedido.esta_pedi_id = 3 OR pedido.esta_pedi_id = 4) AND "+date);
                    
                    sql = sql.concat("GROUP BY empresa.empr_id, empresa.empr_nombre_comercial "+ order +";");
                    //sql = sql.concat("GROUP BY empresa.empr_id, empresa.empr_nombre_comercial ");
                    
                    //sql = sql.concat("LIMIT "+numRows+" "+order+";");
                }
            }
            
            try
            {
                //System.out.println( "Top SQL: " + sql );

                result = SQLUtilities.query(sql);
                
                if(result.size() > 0 && result != null) 
                {
                    for(int i=0; i<result.size();i++)
                    {
                        row = new Vector();
                        aux = (Hashtable)result.elementAt(i);
                        if( reportType == 1){
                            row.addElement( aux.get("prod_prov_id") );
                            row.addElement( (String)aux.get("prod_prov_descripcion_corta") );
                            row.addElement( aux.get("total2") );
                        }else{
                            row.addElement( aux.get("empr_id") );
                            row.addElement( (String)aux.get("empr_nombre_comercial") );
                            row.addElement( aux.get("total2") );
                        }
                        
                        reportList.addElement( row );
                    }
                }
            }
            catch(QueryException qe)
            {
                System.out.println("Query Error "+qe);
                //qe.printStackTrace();
            }
            
            
            
            if( reportList.size() > 0 && numRows > 0){
                
                Vector auxReportList = new Vector();
                
                if( numRows > reportList.size() ){
                    
                    numRows = reportList.size();
                    
                }
                
                for( int i=0; i<numRows; i++ ){
                    auxReportList.addElement(  reportList.elementAt( i ) );
                }
                
                reportList = auxReportList;
            }
            
            
            
            return reportList;
            
        }
        
        
        public void categoriesReportBuilder( int companyType, int companyId, int storeId, int categoryId, Date startDate, Date endDate, 
            int countryId, int provinceId, int cityId, int zoneId, int neighbourhoodId, int sort ){
        
            Vector row;
            Vector result = new Vector();
            Hashtable aux = new Hashtable();
            
            String select;
            
            String from = "FROM producto_pedido, producto_proveedor, categoria_producto, pedido, establecimiento," +
                          "barrio, zona, ciudad, departamento, pais, proveedor ";
            
            String where = "\nWHERE producto_pedido.prod_prov_id = producto_proveedor.prod_prov_id \n " + 
                           "AND producto_proveedor.cate_prod_codigo = categoria_producto.cate_prod_codigo \n " +
                           "AND producto_pedido.pedi_id = pedido.pedi_id \n " +
                           "AND pedido.esta_id = establecimiento.esta_id \n " +
                           "AND establecimiento.barr_id = barrio.barr_id \n " +
                           "AND barrio.zona_id = zona.zona_id \n " +
                           "AND zona.ciud_id = ciudad.ciud_id \n " +
                           "AND ciudad.depa_id = departamento.depa_id \n " +
                           "AND departamento.pais_id = pais.pais_id \n " +
                           "AND pedido.empr_id = proveedor.empr_id ";
            
            String groupBy;
            
            String order;
            order = ( sort==0 )?"\nORDER BY total DESC ":"\nORDER BY total ASC ";
            
            String date = "";
            if( startDate.getTime() != 0 && endDate.getTime() != 0){
                date = "\nAND (pedido.pedi_fecha BETWEEN \'"+startDate+"\' AND \'"+endDate+"\') ";
            }
            
            if( categoryId == -1 ){
                
                select = "SELECT categoria_producto.cate_prod_codigo, categoria_producto.cate_prod_nombre," +
                                "sum( producto_pedido.prod_pedi_cantidad ) as unidades,"+
                                "sum( producto_pedido.prod_pedi_precio * producto_pedido.prod_pedi_cantidad ) as total \n ";
                
                where += "\nAND categoria_producto.cate_prod_codigo IN( SELECT cate_prod_codigo FROM categoria_producto )";
                
                groupBy = "\nGROUP BY categoria_producto.cate_prod_codigo, categoria_producto.cate_prod_nombre ";
                
            }else{
            
                select = "SELECT producto_proveedor.prod_prov_id, producto_proveedor.prod_prov_descripcion_corta," +
                            "sum( producto_pedido.prod_pedi_cantidad ) as unidades," + 
                            "sum( producto_pedido.prod_pedi_precio * producto_pedido.prod_pedi_cantidad ) as total \n ";
                
                where += "\nAND producto_proveedor.prod_prov_id IN (SELECT prod_prov_id FROM producto_proveedor WHERE cate_prod_codigo = "+categoryId+") ";
                
                groupBy = "\nGROUP BY producto_proveedor.prod_prov_id, producto_proveedor.prod_prov_descripcion_corta";
                
            }
            
            if(companyType==1 && companyId!=-1){
                from += ", empresa, minorista ";
                where += "\nAND minorista.empr_id=empresa.empr_id AND empresa.empr_id="+companyId+" ";

                if(storeId!=-1) where += "AND establecimiento.esta_id="+storeId+" ";

            }

            if(companyType==2 && companyId!=-1){
                from += ", empresa ";
                where += "\nAND proveedor.empr_id=empresa.empr_id AND empresa.empr_id="+companyId+" ";
            }
            
            if(countryId!=-1) where += "\nAND pais.pais_id="+countryId+" ";

            if(provinceId!=-1) where += "\nAND departamento.depa_id="+provinceId+" ";
        
            if(cityId!=-1) where += "\nAND ciudad.ciud_id="+cityId+" ";
        
            if(zoneId!=-1) where += "\nAND zona.zona_id="+zoneId+" ";
        
            if(neighbourhoodId!=-1) where += "\nAND barrio.barr_id="+neighbourhoodId+" ";
            
            where += date;
            //Se construye la cadena de consulta
            String sql = select + from + where + groupBy + order ;
            
            try
            {
                System.out.println( "Categories SQL: \n" + sql );

                result = SQLUtilities.query(sql);
                
                if(result.size() > 0 && result != null) 
                {
                    for(int i=0; i<result.size();i++)
                    {
                        row = new Vector();
                        
                        double t = 0;
                        int q = 0;
                        
                        aux = (Hashtable)result.elementAt(i);
                        
                        if( categoryId == -1 ){
                            
                            row.addElement( aux.get( "cate_prod_codigo" ) );
                            row.addElement( aux.get( "cate_prod_nombre" ) ); 
                            
                        }else{
                        
                            row.addElement( aux.get( "prod_prov_id" ) );
                            row.addElement( aux.get( "prod_prov_descripcion_corta" ) ); 
                            
                        }
                        
                        q = ((Integer) aux.get( "unidades" ) ).intValue();
                        t = ((Double) aux.get( "total2" ) ).doubleValue();

                        this.quantity += q;
                        this.total += t;

                        row.addElement( new Integer( q ) );
                        row.addElement( new Double( t ) );
                        
                        this.report.addElement( row );
                    }
                }
            }
            catch(QueryException qe)
            {
                System.out.println("Query Error "+qe);
                //qe.printStackTrace();
            }
            
            System.out.println( "Q: " + this.quantity );
            //System.out.println( "T: " + this.total );
            
            //Construcción de porcentajes !!!
            Vector auxReport = new Vector();
            for( int i=0;i<this.report.size();i++ ){
                
                Vector reportRow = (Vector)this.report.elementAt( i );
                int auxq = ((Integer)reportRow.elementAt( 2 )).intValue();
                double auxt = ((Double)reportRow.elementAt( 3 )).doubleValue();
                
                reportRow.addElement( new Double( ((double)auxq / (double)this.quantity)*100 ) );
                reportRow.addElement( new Double( (auxt/this.total)*100 ) );
                
                auxReport.add( reportRow );
                
            }
            
            this.report = auxReport;
            
        }
        
        
        public void supplierReportBuilder( int supplierId, Date startDate, Date endDate, int reportType ){

            Vector result = new Vector();
            Hashtable aux = new Hashtable();
            Vector row;
            String sql = "";
            
            switch( reportType ){
            
                //Distribución superofertas
                case 1:
                    
                    sql = "SELECT super_oferta.supe_ofer_id, count(*) as unidades , sum(pedi_total) as total \n" +
                          "FROM pedido, proveedor, super_oferta \n" +
                          "WHERE proveedor.empr_id = super_oferta.empr_id AND \n " +
                          "pedido.pedi_superoferta = super_oferta.supe_ofer_id AND \n " +
                          "proveedor.empr_id ="+supplierId +" \n";
                          
                    if( startDate.getTime() > 0 && endDate.getTime() > 0 ){
                    
                        sql += " AND pedido.pedi_fecha BETWEEN \'" + startDate.toString() + "\' AND " +
                               "\'" + endDate.toString() + " \' \n ";
                        
                    }      
                    
                          
                    sql +="GROUP BY super_oferta.supe_ofer_id \n" +
                          "ORDER BY total DESC ";
                    
                break;
                
                
                //Distribución de activación de productos
                case 2:
                    
                    sql = "SELECT producto_proveedor.cate_prod_codigo, categoria_producto.cate_prod_nombre,count(*) as unidades \n" +
                          "FROM producto_proveedor, categoria_producto \n" +
                          "WHERE producto_proveedor.prod_prov_estado <> 0 AND \n" +
                          "producto_proveedor.cate_prod_codigo = categoria_producto.cate_prod_codigo AND \n" +
                          "producto_proveedor.empr_id = " + supplierId + " \n" +
                          "GROUP BY producto_proveedor.cate_prod_codigo, categoria_producto.cate_prod_nombre \n" +
                          "ORDER BY unidades DESC ";
                    
                break;
                
                
            }
            
            
            try{
                
                System.out.println( sql );
                result = SQLUtilities.query( sql );
            
                if( result.size() >  0 ){
                    
                    for( int i=0;i<result.size();i++ ){
                        
                        row = new Vector();
                        
                        double t = 0;
                        int q = 0;
                        
                        aux = (Hashtable)result.elementAt(i);
                        
                        if( reportType == 1 ){
                            
                            row.addElement( aux.get( "supe_ofer_id" ) );
                            q = ((Integer) aux.get( "unidades" ) ).intValue();
                            t = ((Double) aux.get( "total2" ) ).doubleValue();
                        
                        }else{
                        
                            row.addElement( aux.get( "cate_prod_codigo" ) );
                            row.addElement( aux.get( "cate_prod_nombre" ).toString() ); 
                            q = ((Integer) aux.get( "unidades" ) ).intValue();
                            
                        }
                        
                        
                        this.quantity += q;
                        this.total += t;

                        row.addElement( new Integer( q ) );
                        row.addElement( new Double( t ) );
                        
                        this.report.addElement( row );
                        
                    }
                    
                }
                
            }catch( QueryException qe ){
                System.out.println( qe.getMessage());
            }
            
            
            System.out.println( "Q: " + this.quantity );
            System.out.println( "T: " + this.total );
            
            //Construcción de porcentajes !!!
            Vector auxReport = new Vector();
            for( int i=0;i<this.report.size();i++ ){
                
                Vector reportRow = (Vector)this.report.elementAt( i );
                int auxq = 0;
                double auxt = 0;
                
                if( reportType == 1 ){
                    auxq = ((Integer)reportRow.elementAt( 1 )).intValue();
                    auxt = ((Double)reportRow.elementAt( 2 )).doubleValue();
                }else{
                    auxq = ((Integer)reportRow.elementAt( 2 )).intValue();
                    auxt = 0;
                }
                
                System.out.println( ((double)auxq / (double)this.quantity)*100  );
                
                reportRow.addElement( new Double( ((double)auxq / (double)this.quantity)*100 ) );
                reportRow.addElement( new Double( (auxt/this.total)*100 ) );
                
                auxReport.add( reportRow );
                
            }
            
            this.report = auxReport;
                        
        }
        
        
        public static void main( String[] args ){
        
            ReportDataAccess rda = new ReportDataAccess();
            rda.supplierReportBuilder( 2347640, new Date(0), new Date(0),  2 );
            
            System.exit( 0 );
            
        }
        
        
        /**
         * Getter for property total.
         * @return Value of property total.
         */
        public double getTotal() {
            return total;
        }
        
        /**
         * Setter for property total.
         * @param total New value of property total.
         */
        public void setTotal(double total) {
            this.total = total;
        }
        
        /**
         * Getter for property quantity.
         * @return Value of property quantity.
         */
        public int getQuantity() {
            return quantity;
        }
        
        /**
         * Setter for property quantity.
         * @param quantity New value of property quantity.
         */
        public void setQuantity(int quantity) {
            this.quantity = quantity;
        }
        
        /**
         * Getter for property report.
         * @return Value of property report.
         */
        public java.util.Vector getReport() {
            return report;
        }
        
        /**
         * Setter for property report.
         * @param report New value of property report.
         */
        public void setReport(java.util.Vector report) {
            this.report = report;
        }
        
        
}