/*
 * ReportOrderList.java
 *
 * Created on 11 de octubre de 2004, 03:51 PM
 */

package com.fenalco.entities;

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

import com.fenalco.entities.OrderList;
import com.fenalco.entities.Order;

import java.sql.Date;

import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 *
 * @author  admin
 */
public class ReportOrderList {
    
    private OrderList orderList;
    private Vector group = new Vector();
    
    /** Creates a new instance of ReportOrderList */
    public ReportOrderList() {
        orderList = new OrderList(true);
        //System.out.println("Entra a ReportOrderList");
    }
    
    /*
     *orderStatus 1 : pedido
     *orderStatus 4 : compra
     */
    
    public ReportOrderList(String role, int shopKeeperId, int supplierId, int storeId, int communityId, String sortCriteriaOrder, int orderStatus, 
                           int superOffer, String groupFieldOrder, String groupOperation, Date startDate, Date endDate){
    
           this(); 
           
           String sqlOrder = new String("");
           String selectOrder = new String("SELECT ");   
           
           if(groupOperation.equals("")){
                selectOrder = selectOrder.concat("pedido.pedi_id, pedido.pedi_fecha ");
           }else{
               selectOrder = selectOrder.concat("pedido.empr_id ");
           }
           
           String fromOrder = new String(" FROM pedido ");
           //String whereOrder = new String(" WHERE pedido.esta_pedi_id="+orderStatus+" ");     //Ya no se tiene en cuenta este criterio
           String whereOrder = new String(" WHERE 1=1 ");
           
           String sqlHistoric = new String("");
           //String selectHistoric = new String("SELECT pedido_historico.pedi_hist_id, pedido_historico.pedi_hist_fecha ");
           String selectHistoric = new String("SELECT pedido_historico.pedi_hist_id as pedi_id, pedido_historico.pedi_hist_fecha as pedi_fecha");
           String fromHistoric = new String(" FROM pedido_historico ");
           String whereHistoric = new String(" WHERE pedido_historico.pedi_hist_estado_pedido_id="+orderStatus+" ");
           
           String and = new String(" AND ");
           String sortByOrder = new String("");
           
           if(groupOperation.equals("")){
                sortByOrder = sortByOrder.concat(" ORDER BY pedi_fecha;");
                System.out.println("sortByOrder->"+sortByOrder);
           }else{
               sortByOrder = sortByOrder.concat(";");
           }
           
           //String sortByHistoric = new String(" ORDER BY pedido_historico.pedi_hist_fecha");
           String init=",";
            /*if(groupOperation.equals("")){
                init=",";
            }*/
           
           if( shopKeeperId != -1 || role.equals("ShopKeeper")){
                //SELECT
                selectOrder = selectOrder.concat(init+"empresa.empr_id, empresa.empr_nombre_comercial");
                groupFieldOrder = groupFieldOrder.concat(",empresa.empr_id, empresa.empr_nombre_comercial ");
                
                //selectHistoric = selectHistoric.concat(init+"empresa.empr_id, empresa.empr_nombre_comercial");

                //FROM
                fromOrder = fromOrder.concat(", establecimiento, empresa");
                fromHistoric = fromHistoric.concat(", establecimiento, empresa");

                //WHERE
                whereOrder = whereOrder.concat(and+"pedido.esta_id = establecimiento.esta_id AND " +
                                               "establecimiento.empr_id = empresa.empr_id ");
                if(and.equals("")){
                    and = and.concat("AND ");
                }

                if(shopKeeperId!=-1){
                    whereOrder = whereOrder.concat(and+"empresa.empr_id = "+shopKeeperId+" ");
                }

                /*whereHistoric = whereHistoric.concat(and+"pedido_historico.pedi_hist_establecimiento_id = establecimiento.esta_id AND " +
                                               "establecimiento.empr_id = empresa.empr_id AND " +
                                               "empresa.empr_id = "+shopKeeperId+" ");
                 */

                if(and.equals("")){
                    and = and.concat("AND ");
                }

                if( storeId != -1){

                    //SELECT
                    selectOrder = selectOrder.concat(", establecimiento.esta_id, establecimiento.esta_nombre");
                    groupFieldOrder = groupFieldOrder.concat(", establecimiento.esta_id, establecimiento.esta_nombre ");
                    //selectHistoric = selectHistoric.concat(", establecimiento.esta_id, establecimiento.esta_nombre");

                    //FROM
                    //fromOrder = fromOrder.concat(", establecimiento");
                    //fromHistoric = fromHistoric.concat(", establecimiento");

                    //WHERE
                    //whereOrder = whereOrder.concat(and+"pedido.esta_id = establecimiento.esta_id AND establecimiento.esta_id="+storeId+" ");
                    //whereHistoric = whereHistoric.concat(and+"pedido_historico.pedi_hist_establecimiento_id = establecimiento.esta_id AND establecimiento.esta_id="+storeId+" ");
                    whereOrder = whereOrder.concat(and+"establecimiento.esta_id="+storeId+" ");
                    whereHistoric = whereHistoric.concat(and+"establecimiento.esta_id="+storeId+" ");


                    if(and.equals("")){
                        and = and.concat("AND ");
                    }
               }
                
               if( supplierId !=- 1 && role.equals("ShopKeeper")){
                    //WHERE
                    whereOrder = whereOrder.concat(and+"pedido.empr_id="+supplierId+" ");
                    whereHistoric = whereHistoric.concat(and+"pedido_historico.empr_id="+supplierId+" ");
               }
                
           }
           
           if( (supplierId != -1 && !role.equals("ShopKeeper")) || role.equals("Supplier")){
                
                //SELECT
                selectOrder = selectOrder.concat(init+"empresa.empr_id, empresa.empr_nombre_comercial");
                selectHistoric = selectHistoric.concat(init+"empresa.empr_id, empresa.empr_nombre_comercial");

                //FROM
                fromOrder = fromOrder.concat(", empresa");
                fromHistoric = fromHistoric.concat(", empresa");
                
                //WHERE
                whereOrder = whereOrder.concat(and+"pedido.empr_id = empresa.empr_id ");

                if(and.equals("")){
                    and = and.concat("AND ");
                }
                
                if(supplierId!=-1){
                    //SELECT
                    selectOrder = selectOrder.concat(", comunidad.comu_id, comunidad.comu_nombre");
                    selectHistoric = selectHistoric.concat(", comunidad.comu_id, comunidad.comu_nombre");                    
                    //WHERE
                    whereOrder = whereOrder.concat(and+"empresa.empr_id = "+supplierId+" ");
                }
                
                
                //whereHistoric = whereHistoric.concat(and+"pedido_historico.pedi_hist_empresa_id = empresa.empr_id AND empresa.empr_id = "+supplierId+" ");

                if(and.equals("")){
                    and = and.concat("AND ");
                }
                

                    //FROM
                    fromOrder = fromOrder.concat(", comunidad, comunidad_establecimiento, establecimiento");
                    //fromHistoric = fromHistoric.concat(", comunidad_establecimiento");

                    //WHERE
                    whereOrder = whereOrder.concat(and+"comunidad.empr_id = empresa.empr_id AND empresa.empr_id = pedido.empr_id "+
                                        "AND pedido.esta_id=establecimiento.esta_id " +
                                        "AND comunidad_establecimiento.comu_id=comunidad.comu_id " +
                                        "AND comunidad_establecimiento.esta_id=establecimiento.esta_id ");
                    //whereHistoric = whereHistoric.concat(and+"comunidad.empr_id = empresa.empr_id AND empresa.empr_id = pedido_historico.pedi_hist_empresa_id"+" ");
                    
                    if(communityId!=-1){
                        //WHERE
                        whereOrder = whereOrder.concat(and+" comunidad.comu_id = "+communityId+" ");
                        //whereHistoric = whereHistoric.concat(and+"comunidad.empr_id = empresa.empr_id AND empresa.empr_id = pedido_historico.pedi_hist_empresa_id AND comunidad.comu_id = "+communityId+" ");
                    }
                        
                    if(and.equals("")){
                        and = and.concat("AND ");
                    }
                    
                    if(communityId!=-1){
                        //SELECT
                        selectOrder = selectOrder.concat(", establecimiento.esta_id, establecimiento.esta_nombre");
                        selectHistoric = selectHistoric.concat(", establecimiento.esta_id, establecimiento.esta_nombre");

                        if(storeId!=-1){
                            //WHERE
                            whereOrder = whereOrder.concat(and+"establecimiento.esta_id = "+storeId+" AND pedido.esta_id="+storeId+" ");
                            //whereHistoric = whereHistoric.concat(and+"comunidad.empr_id = empresa.empr_id AND empresa.empr_id = pedido_historico.pedi_hist_empresa_id AND comunidad.comu_id = "+communityId+" ");
                        }

                        if(and.equals("")){
                            and = and.concat("AND ");
                        }
                    }
           }
           
           
           
          
           
           /*
           if(orderStatus>-1){
                whereOrder = whereOrder.concat(and+"pedido.esta_pedi_id ="+orderStatus+" ");
                whereHistoric = whereHistoric.concat(and+"pedido_historico.pedi_hist_estado_pedido_id ="+orderStatus+" ");
           }*/
           
           if(superOffer == 1){
                whereOrder = whereOrder.concat(and+"pedido.pedi_superoferta<>0 ");
                whereHistoric = whereHistoric.concat(and+"pedido_historico.pedi_hist_superoferta<>0 ");
           }
           
           if( startDate.getTime() > 0){
                
                //WHERE
                whereOrder = whereOrder.concat(and+"pedido.pedi_fecha BETWEEN \'"+startDate+"\' AND \'"+endDate+"\' ");
                whereHistoric = whereHistoric.concat(and+"pedido_historico.pedi_hist_fecha BETWEEN \'"+startDate+"\' AND \'"+endDate+"\' ");

                if(and.equals("")){
                    and = and.concat("AND ");
                }
           }
           
           if( !groupOperation.equals("") ){
                
               //SELECT
                selectOrder = selectOrder.concat(","+groupOperation+" as operation ");
                selectHistoric = selectHistoric.concat(","+groupOperation+" as operation");

                //FROM
                fromOrder = fromOrder.concat(", producto_pedido ");
                
                //WHERE
                whereOrder = whereOrder.concat(and+" producto_pedido.pedi_id=pedido.pedi_id ");
                whereOrder = whereOrder.concat(" GROUP BY "+groupFieldOrder+" ");
                whereHistoric = whereHistoric.concat(" GROUP BY "+groupFieldOrder+" ");
                
                if(supplierId==-1 && (shopKeeperId!=-1 || role.equals("ShopKeeper"))){
                    whereOrder=whereOrder.concat(" empresa.empr_id, empresa.empr_nombre_comercial ");
                    whereOrder=whereOrder.concat(" ,establecimiento.esta_id, establecimiento.esta_nombre ");
                }else if(shopKeeperId==-1){
                    whereOrder=whereOrder.concat(" empresa.empr_id, empresa.empr_nombre_comercial ");
                    if(supplierId!=-1){
                        whereOrder=whereOrder.concat(" ,comunidad.comu_id, comunidad.comu_nombre ");
                        if(communityId!=-1){    
                            whereOrder=whereOrder.concat(" ,establecimiento.esta_id, establecimiento.esta_nombre ");                        
                        }
                    }
                }

           }
           
           sqlOrder = sqlOrder.concat(selectOrder);
           sqlOrder = sqlOrder.concat(fromOrder);
           sqlOrder = sqlOrder.concat(whereOrder);
           //sqlOrder = sqlOrder.concat(sortByOrder);
           
           sqlHistoric = sqlHistoric.concat(selectHistoric);
           sqlHistoric = sqlHistoric.concat(fromHistoric);
           sqlHistoric = sqlHistoric.concat(whereHistoric);
           //sqlHistoric = sqlHistoric.concat(sortByHistoric);
           
           //String sqlTotal = new String( sqlOrder.concat(" UNION "+sqlHistoric) );
           String sqlTotal = sqlOrder;
           
           if( !sortCriteriaOrder.equals("")){
               sortByOrder = " ORDER BY "+sortCriteriaOrder+";";
           }
           
           /*if ( !sortCriteriaHistoric.equals("")){
               sortByHistoric = " ORDER BY "+sortCriteriaHistoric;
           }*/
           
           sqlTotal = sqlTotal.concat(sortByOrder);
           
           System.out.println("EL SQL->"+sqlTotal);
           
           Vector result;
           Hashtable aux = new Hashtable();
           Vector orders = new Vector();
           ReportShopKeeperStoreList rshsl=null;
           ReportSupplierCommunityList rscl=null;
           ReportSupplierStoreList rssl=null;
           
           try{
                result = SQLUtilities.query(sqlTotal);
                if(groupOperation.equals("")){
                    OrderList list = new OrderList();
                    for( int i=0; i<result.size(); i++){
                        aux = ( Hashtable )result.elementAt( i );
                        orders.addElement( new Order( new Integer( aux.get( "pedi_id" ).toString() ).intValue() ) );
                    }

                    list.setOrders( orders );

                    this.setOrderList( list );
                }else{
                    this.orderList=new OrderList();                    
                    if(shopKeeperId!=-1 || role.equals("ShopKeeper")){
                        rshsl=new ReportShopKeeperStoreList();
                        for( int i=0; i<result.size(); i++){
                            aux = ( Hashtable )result.elementAt( i );
                            rshsl.setShopKeeper(aux.get("empr_nombre_comercial").toString());
                            if(shopKeeperId!=-1 && storeId!=-1){
                                rshsl.setStore(aux.get("esta_nombre").toString());
                            }
                            rshsl.setTotal(aux.get("operation2").toString());
                            group.addElement( rshsl );
                        }
                    }else if(supplierId!=-1 || role.equals("Supplier")){
                        if(communityId==-1){
                            rscl=new ReportSupplierCommunityList();
                            for( int i=0; i<result.size(); i++){
                                aux = ( Hashtable )result.elementAt( i );
                                rscl.setSupplier(aux.get("empr_nombre_comercial").toString());
                                if(supplierId!=-1){
                                    rscl.setCommunity(aux.get("comu_nombre").toString());
                                }
                                rscl.setTotal(aux.get("operation2").toString());
                                group.addElement( rscl );
                            }
                        }else{
                            rssl=new ReportSupplierStoreList();
                            System.out.println("afueraFOR");
                            for( int i=0; i<result.size(); i++){
                                System.out.println("dentroFOR");
                                aux = ( Hashtable )result.elementAt( i );
                                rssl.setSupplier(aux.get("empr_nombre_comercial").toString());
                                rssl.setCommunity(aux.get("comu_nombre").toString());
                                rssl.setStore(aux.get("esta_nombre").toString());
                                rssl.setTotal(aux.get("operation2").toString());
                                group.addElement( rssl );
                            }
                        }
                    }
                }
           
           }catch(QueryException qe){
                System.out.println("Query Error "+qe);
           }
    }
    
    public ReportOrderList( int supplierId, Date startDate, Date endDate, int cityId ){
    
        this();
        
        String select = "SELECT pedido.pedi_id, empresa.empr_nombre_comercial ";
        String from = "FROM pedido, empresa ";
        String where = "WHERE pedido.empr_id = empresa.empr_id ";
        String orderby = "ORDER BY empresa.empr_nombre_comercial,pedido.esta_id, pedido.pedi_total";
        
        if( supplierId > -1 ){
            
            where = where + "AND pedido.empr_id=" + supplierId + " ";
            
        }
        
        if( startDate.getTime() > 0 && endDate.getTime() > 0 ){
            
            where = where + "AND pedido.pedi_fecha BETWEEN \'" + startDate.toString() + "\' AND \'" + endDate.toString() + "\' " ;
             
        }
        
        if( cityId > -1 ){
            
            from = from + ",establecimiento,barrio,zona,ciudad ";
            where = where + "AND pedido.esta_id = establecimiento.esta_id AND establecimiento.barr_id = barrio.barr_id " +
                    "AND barrio.zona_id = zona.zona_id AND zona.ciud_id = ciudad.ciud_id AND ciudad.ciud_id = " + cityId + " ";
            
            orderby = orderby + ",ciudad.ciud_id";
        }
        
        orderby = orderby + ";";
        
        String sql = select + from + where + orderby;
        System.out.println( sql );
        
        Vector result = new Vector();
        Hashtable aux = new Hashtable();
        Vector orders = new Vector();
        Order order = new Order();
        
        try{
            
            result = SQLUtilities.query( sql );
            if( result.size() > 0 ){
                
                OrderList list = new OrderList();
                for( int i=0; i<result.size(); i++){
                    aux = ( Hashtable )result.elementAt( i );
                    int orderId = new Integer( aux.get( "pedi_id" ).toString() ).intValue();
                    order = new Order( orderId );
                    orders.addElement( order );
                    
                }
                
                list.setOrders( orders );

                this.setOrderList( list );
                
            }
            
        }catch( QueryException qe ){
        
            System.out.println( qe.getMessage() ); 
            
        }
        
    }
    
    
    public ReportOrderList( int companyType, int companyId, int communityId, int storeId, String category,
                            Date startDate, Date endDate ){
        
         this();
         
         String select = "SELECT pedido.pedi_id ";
         String from = "FROM pedido ";
         String where = "WHERE 1=1 ";
         String orderBy = "ORDER BY ";
         
         if( companyType == 1 ){
         //Minorista
             if( companyId != -1 ){
                
                    //Minorista - Todos los establecimientos
                    select += ", empresa.empr_nombre_comercial, establecimiento.esta_nombre ";
                    from += ", establecimiento, empresa ";
                    where  += "AND pedido.esta_id = establecimiento.esta_id \n" +
                              "AND establecimiento.empr_id = empresa.empr_id \n" +
                              "AND empresa.empr_id="+companyId+" ";
                    //Minorista - Establecimiento
                    if( storeId != -1 ){
                        
                       where += "AND establecimiento.esta_id="+storeId+" "; 
                        
                    }
                    
                    orderBy += "empresa.empr_nombre_comercial, establecimiento.esta_nombre ASC;";
                    
             }
             
         }else{
         //Proveedor
             
             if( companyId != -1 ){
             
                //Proveedor - Todas las comunidades
                select += ", empresa.empr_nombre_comercial  "; 
                from += ", empresa ";
                where += "AND pedido.empr_id= empresa.empr_id \n" +
                         "AND empresa.empr_id="+companyId+" ";
               
                //Proveedor - Comunidad
                if( communityId != -1 ){
                    
                    select += ", comunidad.comu_nombre ";
                    from += ", establecimiento, comunidad_establecimiento, comunidad ";
                    where += "AND pedido.esta_id = establecimiento.esta_id \n" +
                             "AND establecimiento.esta_id = comunidad_establecimiento.esta_id \n" +
                             "AND comunidad_establecimiento.comu_id = comunidad.comu_id \n" +
                             "AND comunidad.comu_id="+communityId+" ";
                    
                    orderBy += "empresa.empr_nombre_comercial, comunidad.comu_nombre ASC;";
                }else{
                    
                    orderBy += "empresa.empr_nombre_comercial ASC;";
                    
                }
                
             }else{
             
                orderBy += "pedido.pedi_fecha DESC;";
                 
             }
             
         }
         
         //Categoría Producto
         if( !category.equals("")  ){
            
             select += ",categoria_producto.cate_prod_nombre ";
             from += ", producto_pedido, producto_proveedor, categoria_producto ";
             where += "AND producto_pedido.pedi_id = pedido.pedi_id \n" +
                      "AND producto_pedido.prod_prov_id = producto_proveedor.prod_prov_id \n" +
                      "AND producto_proveedor.cate_prod_codigo = categoria_producto.cate_prod_codigo \n" +
                      "AND categoria_producto.cate_prod_nombre LIKE \'%"+category+"%\' ";
             
             /*
              Es muy posible que este ordenamiento dependa de las tablas importadas anteriormente para presentar 
              un listado mejor organizado.
             */
             orderBy = "ORDER BY categoria_producto.cate_prod_nombre ASC;";
             
         }
         
         //Rango de fechas
         if( startDate.getTime() >  0 && endDate.getTime() > 0 ){
         
             where += "AND pedido.pedi_fecha BETWEEN \'"+startDate.toString()+"\' AND \'"+endDate.toString()+"\' ";
             
         }
         
         //Ejecución Consulta
         Vector result = new Vector();
         Hashtable aux = new Hashtable();
         Vector orders = new Vector();
         Order order = new Order();
         
         String sql = select + "\n" + from + "\n" + where + "\n" + orderBy;
         
         //System.out.println( "SQL Productos: " + sql  );
         
         
         try{
            
             result = SQLUtilities.query( sql );
             /*
             if( result.size() > 0 ){
                
                OrderList list = new OrderList();
                for( int i=0; i<result.size(); i++){
                    aux = ( Hashtable )result.elementAt( i );
                    int orderId = new Integer( aux.get( "pedi_id" ).toString() ).intValue();
                    order = new Order( orderId );
                    orders.addElement( order );
                }
                
                list.setOrders( orders );
                this.setOrderList( list );
                 
             }
             */
             
         }catch( QueryException qe ){
             
            System.out.println( qe.getMessage() );
            
         }
                            
         
    
    }
    
    /*
    public static void main(String[] args){
        
        //Aminta = 2153655
        //Establecimiento = 31969579 
        
        //Corbeta = 2347640
        //Comunidad = 3005516

        //Arroz = 101001
        
        ReportOrderList report = new ReportOrderList(2, -1, 3005516, 1, "", new Date(1000),  new Date(1000) );
        OrderList list = report.getOrderList();
        int numOrders = 0;
        double totalOrders = 0;
        double avgOrders = 0;
        
        for(int i=0; i<list.getOrders().size(); i++){
            
            Order order = (Order)list.getOrders().elementAt(i);
            //System.out.println(order.getId());
            numOrders++;
            totalOrders += order.getValue();
        }
        
        
        System.out.println("Número de pedidos: " + numOrders);
        //System.out.println("Total Pedidos: " + totalOrders );
        System.out.println("Total Pedidos: " + DataAccess.getCurrency( totalOrders ));
        //System.out.println("Valor Promedio Pedido: " + ( totalOrders / numOrders ) );
        System.out.println("Valor Promedio Pedido: " + DataAccess.getCurrency( totalOrders / numOrders ) );
        System.exit(0);
         
        
    }
    */
    
    
    public Vector getStats(){
        
        Vector values = new Vector();
        int numOrders = 0;
        double totalOrders = 0;
        double totalOrdersDiscount = 0;
        double avgOrders = 0;
        double avgOrdersDiscount = 0;
        
        Order order = new Order();
        
        for( int i=0;i<this.getOrderList().getOrders().size();i++ ){
            
            order = ( (Order) this.getOrderList().getOrders().elementAt( i ) );
            numOrders++;
            totalOrders += order.getValue();
            totalOrdersDiscount += ( order.getValue() - order.getDiscount() );
            
        }
        
        
        avgOrders = totalOrders / numOrders;
        avgOrdersDiscount = totalOrdersDiscount / numOrders;
        //System.out.println( numOrders + " " + totalOrders + " " + avgOrders);
        
        values.addElement( new Integer( numOrders ) );
        values.addElement( new Double( totalOrders ) );
        values.addElement( new Double( avgOrders ) );
        values.addElement( new Double( totalOrdersDiscount ) );
        values.addElement( new Double( avgOrdersDiscount ) );
        
        return values;
    }
    
    /**
     * Getter for property orderList.
     * @return Value of property orderList.
     */
    public OrderList getOrderList() {
        return orderList;
    }
    
    /**
     * Setter for property orderList.
     * @param orderList New value of property orderList.
     */
    public void setOrderList(OrderList orderList) {
        this.orderList = orderList;
    }
    
    
    
    /**
     * Getter for property group.
     * @return Value of property group.
     */
    public java.util.Vector getGroup() {
        return group;
    }
    
    /**
     * Setter for property group.
     * @param group New value of property group.
     */
    public void setGroup(java.util.Vector group) {
        this.group = group;
    }
    
}
