public FuelSummaryHelper getConsumedSum(List<FuelSummaryHelper> consumedTable)
 {
     FuelSummaryHelper result = new FuelSummaryHelper();
         double totalDistance = 0;
         double volumeSum = 0;
         double efecFuel = 0;
         foreach (FuelSummaryHelper unitSum in consumedTable)
         {
             totalDistance += unitSum.distancia;
             volumeSum += unitSum.volBruto;
             efecFuel += unitSum.volEfectivo;
         }
         result.distancia = totalDistance;
         result.volumen = volumeSum;
         result.volBruto = volumeSum;
         result.volEfectivo =  efecFuel;
         return result;
 }
 /* nuevos */
 public FuelSummaryHelper getCargasSum(List<FuelSummaryHelper> cargasTable)
 {
     FuelSummaryHelper result = new FuelSummaryHelper();
         int timesEvent = 0;
         double volumeSum = 0;
         foreach (FuelSummaryHelper unitSum in cargasTable)
         {
             timesEvent += unitSum.cantEventos;
             volumeSum += unitSum.volumen;
         }
         result.cantEventos = timesEvent;
         result.volumen = volumeSum;
         return result;
 }
    /** nuevos ***/
    public List<FuelSummaryHelper> getCargasTableTable(string cliente, List<string> unidades, DateTime fInicial, DateTime fFinal, int zona)
    {
        List<FuelSummaryHelper> result = new List<FuelSummaryHelper>();

            foreach (string unidad in unidades)
            {
                FuelSummaryHelper currentRes = new FuelSummaryHelper();
                currentRes.unidad = unidad;
                List<Ubicacion> cargasUbi = getTypeOfFuelEvent(cliente , unidad, fInicial, fFinal, zona, 105 )  ;
                currentRes.volumen = getTotalVolumeFuelEvents(cargasUbi)/100.0;
                currentRes.cantEventos = cargasUbi.Count;
                result.Add(currentRes);
            }
            return result;
    }
    public List<FuelSummaryHelper> getRalentiTableTable(string cliente, List<string> unidades, DateTime fInicial, DateTime fFinal, int zona)
    {
        List<FuelSummaryHelper> result = new List<FuelSummaryHelper>();

            foreach (string unidad in unidades)
            {
                FuelSummaryHelper currentRes = new FuelSummaryHelper();
                FuelSummaryHelper helper = getRalentiFuel(cliente, unidad, fInicial, fFinal, zona);
                currentRes.unidad = unidad;
                currentRes.tiempo = helper.tiempo;
                currentRes.volumen = helper.volumen;
                result.Add(currentRes);
            }

            return result;
    }
    public List<FuelSummaryHelper> getResumenComportamiento(string cliente, List<string> unidades, DateTime fInicial, DateTime fFinal, int zona, List<FuelSummaryHelper> consumedData)
    {
        List<FuelSummaryHelper> result = new List<FuelSummaryHelper>();
           int counter = 0;
            foreach (string unidad in unidades)
            {
                Historico resumenHelper = RastreoEstaticoBD.Historico(cliente, unidad, fInicial, fFinal);
                List<Ubicacion> ubicaciones = resumenHelper.Ubicaciones;
                Ubicacion primeraTiempoMuerto = null;
                double minutosDetenido = 0;
                List<Ubicacion> resumidas = new List<Ubicacion>();

                foreach (Ubicacion ubicacion in ubicaciones)
                {
                    Ubicacion ubiAnterior = ubicaciones.IndexOf(ubicacion) == 0 ? ubicacion : ubicaciones[ubicaciones.IndexOf(ubicacion) - 1];
                    double[] coordenadasUTManterior = ConversionesGeograficas.LatLonToUTMXY(ubiAnterior.Latitud, ubiAnterior.Longitud);
                    double[] coordenadasUTMactual = ConversionesGeograficas.LatLonToUTMXY(ubicacion.Latitud, ubicacion.Longitud);
                    double distancia = Math.Sqrt(Math.Pow((coordenadasUTMactual[0] - coordenadasUTManterior[0]), 2) + Math.Pow((coordenadasUTMactual[1] - coordenadasUTManterior[1]), 2));
                    if (distancia < 10000)
                    {
                        if (ubicacion.Velocidad > 11 || (distancia > 62 && ubicaciones.IndexOf(ubicacion) != 0))
                        {
                            if (primeraTiempoMuerto != null)
                            {
                                primeraTiempoMuerto.Tiempo = ubicacion.Fecha.Subtract(primeraTiempoMuerto.Fecha).TotalMinutes;
                                minutosDetenido += primeraTiempoMuerto.Tiempo;
                                resumidas.Add(primeraTiempoMuerto);
                                primeraTiempoMuerto = null;
                            }
                            resumidas.Add(ubicacion);
                        }
                        else if (primeraTiempoMuerto != null)
                        {
                            if (ubicacion.Evento != 0)
                            {
                                resumidas.Add(ubicacion);
                            }
                        }
                        else if (primeraTiempoMuerto == null) // es la primera
                        {
                            primeraTiempoMuerto = ubicacion;
                        }
                    }
                }

                if (primeraTiempoMuerto != null)
                {
                    primeraTiempoMuerto.Tiempo = ubicaciones[ubicaciones.Count - 1].Fecha.Subtract(primeraTiempoMuerto.Fecha).TotalMinutes;
                    resumidas.Add(primeraTiempoMuerto);
                    minutosDetenido += primeraTiempoMuerto.Tiempo;
                }

                TimeSpan t =   fFinal - fInicial;
                double tiempoTotalCon = t.TotalMinutes;
                long tiempoTotal = Convert.ToInt64( tiempoTotalCon );

                long tiempoMovimiento = tiempoTotal - Convert.ToInt64( minutosDetenido );

                FuelSummaryHelper currentRes = new FuelSummaryHelper();
                currentRes.unidad = unidad;//AutentificacionBD.GetDescripcionUnidad(unidad);
                currentRes.velMax = RastreoEstaticoBD.maximaVelocidadUnidad(cliente,unidad,fInicial,fFinal);
                currentRes.tiempoMov = tiempoMovimiento;
                currentRes.tiempoMuerto = Convert.ToInt64( minutosDetenido );//getDeadTime(cliente, unidad, fInicial, fFinal, zona);

                double cosumedFuel = consumedData[counter].volBruto;
                double distanceTraveled = consumedData[counter].distancia;

                if(cosumedFuel > 0 && distanceTraveled > 0){
                    currentRes.rendBruto =  distanceTraveled/cosumedFuel;

                }else{
                    currentRes.rendBruto =  0;

                }

                double effectiveFuel = consumedData[counter].volEfectivo;
                if(effectiveFuel > 0 && distanceTraveled > 0){
                    currentRes.rendEfectivo =  distanceTraveled/effectiveFuel;

                }else{
                    currentRes.rendEfectivo = 0;
                }

                result.Add(currentRes);

                counter++;
            }
            return result;
    }
    /* Para conseguir el valor de ralenti con los sensores es necesario obtener un calculo qe omita los evento **/
    public FuelSummaryHelper getRalentiFuel(string cliente, string unidad, DateTime fInicial, DateTime fFinal, int zona)
    {
        double relentiFuel = 0;
            long ralentiTime = 0;
            double consumeRalentiMinutoCombu = 6;
            bool calculado = true;
            bool sinDiez = false;
            double addBeforeRalentiEventFuel = 0; // In relaton to the 3 min fuel

            FuelSummaryHelper ralentiInfo =  new FuelSummaryHelper();
            Historico ralenti = RastreoEstaticoBD.RalentiTrans(cliente, unidad, fInicial, fFinal);

            if (ralenti.Ubicaciones.Count > 0)
            {
                List<Ubicacion> ubicacionesIdling = new List<Ubicacion>();
                Ubicacion ultimaUbicacion = ralenti.Ubicaciones[0];

                int tiempoAgregado = 3; // tiempo agregado (lo que decida el albitro :P ) en el que comienza el ralenti
                addBeforeRalentiEventFuel = tiempoAgregado * consumeRalentiMinutoCombu ;
                bool inicio = false; // Basicamente amigo mio sucedio 70 trye sucedio 71 false para que sea ralenti completo debe suceder un 71 con true en caso contrario un ralenti incompleto
                DateTime fechaInicioRal = new DateTime(); // fecha hora que inicio ralenti
                double tiempoRalenti = 0; // tiempo que duro en ralenti
                int totalRalenti = 0;

                double combustibleInicioRalenti = 0;
                double combustibleFinalRalenti = 0;
                double combustibleRalentiEvento = 0;

                foreach (Ubicacion ubicacionIdling in ralenti.Ubicaciones)
                {
                    if (ubicacionIdling.Evento == 70)
                    { // inicio ralenti en esta ubicacion
                        fechaInicioRal = ubicacionIdling.Fecha;
                        inicio = true;
                        tiempoRalenti = tiempoAgregado; // tiempo agregado
                        ultimaUbicacion = ubicacionIdling;
                        combustibleInicioRalenti = RastreoEstaticoBD.valueOfFuelEventBetween(cliente, unidad, fechaInicioRal, fFinal, true);
                        /*
                        if(sinDiez){
                            combustibleInicioRalenti = RastreoEstaticoBD.valueOfFuelEventBetween(cliente, unidad, fInicial, fFinal, false);
                        }else{
                            combustibleInicioRalenti = ubicacionIdling.CombustibleGlobal;
                        }
                        */

                    }
                    else if (inicio)
                    { // evento 71 y ya paso el 70
                        double tiempoDiferenciaRalenti = ubicacionIdling.Fecha.Subtract(fechaInicioRal).TotalMinutes;
                        tiempoRalenti += tiempoDiferenciaRalenti;

                        inicio = false;
                        ultimaUbicacion.Tiempo = tiempoRalenti;
                        totalRalenti += (int)tiempoRalenti;
                        ubicacionesIdling.Add(ultimaUbicacion);
                        ultimaUbicacion = ubicacionIdling;
                        if(calculado){
                            relentiFuel +=   (int)tiempoRalenti * consumeRalentiMinutoCombu;
                        }else{
                            combustibleFinalRalenti = RastreoEstaticoBD.valueOfFuelEventBetween(cliente, unidad, fechaInicioRal, ubicacionIdling.Fecha, false);
                            // var eventosCombustibleAgrupados = RastreoEstaticoBD.EventosCombustible(cliente, unidad, fechaInicioRal, ubicacionIdling.Fecha, false);
                            /*
                            var eventosCombustibleAgrupados = RastreoEstaticoBD.EventosCombustible(cliente, unidad, fInicial, fFinal);
                            eventosCombustibleAgrupados = agruparEventosCombustible(eventosCombustibleAgrupados, "inicios");
                            historico.Ubicaciones.AddRange(eventosCombustibleAgrupados);
                            */
                            relentiFuel += combustibleInicioRalenti  - combustibleFinalRalenti;
                            /*
                            if(sinDiez){
                                combustibleFinalRalenti = RastreoEstaticoBD.valueOfFuelEventBetween(cliente, unidad, fInicial, fFinal, false);
                                combustibleRalentiEvento = combustibleInicioRalenti - combustibleFinalRalenti ; // combustible consumido
                                if (combustibleRalentiEvento > 0 )
                                {
                                    relentiFuel += combustibleRalentiEvento + addBeforeRalentiEventFuel;// la diferencia de los sensores mas lo de los 3 min
                                }
                            }else{
                                combustibleFinalRalenti = ubicacionIdling.CombustibleGlobal;
                                combustibleRalentiEvento = combustibleInicioRalenti - combustibleFinalRalenti ; // combustible consumido
                                if (combustibleRalentiEvento > 0 )
                                {
                                    relentiFuel += combustibleRalentiEvento + addBeforeRalentiEventFuel;// la diferencia de los sensores mas lo de los 3 min
                                }
                            }
                            */
                        }
                    }

                }
                ralentiTime = totalRalenti; // no quice moverle
            }
            ralentiInfo.tiempo = ralentiTime;
            ralentiInfo.volumen = (relentiFuel)/100.0;
            return ralentiInfo;
    }
 public FuelSummaryHelper getRalentiSum(List<FuelSummaryHelper> ralentiTable)
 {
     FuelSummaryHelper result = new FuelSummaryHelper();
         long totalTimeRalenti = 0;
         double volumeSum = 0;
         foreach (FuelSummaryHelper unitSum in ralentiTable)
         {
             totalTimeRalenti += unitSum.tiempo;
             volumeSum += unitSum.volumen;
         }
         result.tiempo = totalTimeRalenti;
         result.volumen = volumeSum;
         return result;
 }
 /*** Sumary Process Start *****/
 public FuelSummaryHelper getPerformanceSum(List<FuelSummaryHelper> resumenComportamientoTable)
 {
     FuelSummaryHelper result = new FuelSummaryHelper();
         double max = 0;
         string unitMax = "";
         long tiempoMov = 0;
         long tiempoMuerto = 0;
         foreach (FuelSummaryHelper unitSum in resumenComportamientoTable)
         {
             if (unitSum.velMax > max)
             {
                 unitMax = unitSum.unidad;
                 max = unitSum.velMax;
             }
             tiempoMov += unitSum.tiempoMov;
             tiempoMuerto += unitSum.tiempoMuerto;
         }
         result.velMax = max;
         /*
         if(max > 10 ){
             result.velMax = max;
         }else{
             result.velMax = 1;
         }
         */
         result.unidad = unitMax;
         result.tiempoMov = tiempoMov;
         result.tiempoMuerto = tiempoMuerto;
         return result;
 }
    public string getPerformanceReportSummary(List<string> unidades, long fechaInicial, long fechaFinal, int zona)
    {
        HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("Usuario");
            if (cookie == null)
            {
                // Response.Redirect("Index.aspx");
            }
            HttpCookie Cookie = System.Web.HttpContext.Current.Request.Cookies.Get("Usuario");
            if (Cookie != null && AutentificacionBD.VerificarToken(Cookie.Values.Get("Token")))
            {
                string clienteID = new Codificador().Desencriptar(cookie.Values.Get("Cliente"));

                DateTime fInicial = Util.FromUnixMilis(fechaInicial);
                DateTime fFinal = Util.FromUnixMilis(fechaFinal);
                //FuelPerformanceReportSummary reportSummary = RastreoEstaticoBD.ReportSummary(clienteID, unidades, fInicial, fFinal, zona);

                FuelPerformanceReportSummary fuelPerformance = new FuelPerformanceReportSummary();
                FuelSummaryHelper auxResumen = new FuelSummaryHelper();
                FuelSummaryHelper auxVolIni = new FuelSummaryHelper();
                FuelSummaryHelper auxVolFin = new FuelSummaryHelper();
                FuelSummaryHelper auxCargas = new FuelSummaryHelper();
                FuelSummaryHelper auxDescargas = new FuelSummaryHelper();
                FuelSummaryHelper auxRalenti = new FuelSummaryHelper();
                FuelSummaryHelper auxConsumido = new FuelSummaryHelper();

                /* Volumenes InicialFinal */
                List<FuelSummaryHelper> initialFuelTable = getInitialFuelTable(clienteID, unidades, fInicial, fFinal, zona);
                fuelPerformance.initialFuelTable = initialFuelTable;
                auxVolIni = getInitialSum(initialFuelTable);

                List<FuelSummaryHelper> finalFuelTable = getFinalFuelTable( clienteID, unidades, fInicial, fFinal, zona);
                fuelPerformance.finalFuelTable = finalFuelTable;
                auxVolFin = getFinalSum(finalFuelTable);

                fuelPerformance.volInicial = auxVolIni.volumen;
                fuelPerformance.volFinal = auxVolFin.volumen;

                /* Cargas */

                List<FuelSummaryHelper> cargasTable = getCargasTableTable(clienteID, unidades, fInicial, fFinal, zona);
                fuelPerformance.cargasTable = cargasTable;
                auxCargas = getCargasSum(cargasTable);

                fuelPerformance.valCargas = auxCargas.cantEventos;
                fuelPerformance.volCargas = auxCargas.volumen;

                /* Descargas  */

                List<FuelSummaryHelper> descargasTable = getDescargasTableTable(clienteID, unidades, fInicial, fFinal, zona);
                fuelPerformance.descargasTable = descargasTable;
                auxDescargas = getDescargasSum(descargasTable);

                fuelPerformance.valDescargas = auxDescargas.cantEventos;
                fuelPerformance.volDescargas = auxDescargas.volumen;

                /* Ralenti */

                List<FuelSummaryHelper> ralentiTable = getRalentiTableTable(clienteID, unidades, fInicial, fFinal, zona);
                fuelPerformance.ralentiTable = ralentiTable;
                auxRalenti = getRalentiSum(ralentiTable);

                fuelPerformance.valRalenti = auxRalenti.tiempo;
                fuelPerformance.volRalenti = auxRalenti.volumen;

                /* Consumido */

                List<FuelSummaryHelper> consumedTable = getConsumedTable(clienteID, unidades,fInicial, fFinal, initialFuelTable, finalFuelTable, cargasTable, descargasTable, ralentiTable, zona);
                fuelPerformance.consumedTable = consumedTable;
                auxConsumido = getConsumedSum(consumedTable);

                fuelPerformance.valConsu = auxConsumido.distancia;
                fuelPerformance.volConsu = auxConsumido.volEfectivo ;
                //fuelPerformance.volBruto = auxConsumido.volBruto;

                /* Reporte Bruto */
                List<FuelSummaryHelper> resumenComportamientoTable = getResumenComportamiento(clienteID, unidades, fInicial, fFinal, zona, consumedTable);
                fuelPerformance.resumenComportamientoTable = resumenComportamientoTable;
                auxResumen = getPerformanceSum(resumenComportamientoTable);

                fuelPerformance.Unit = auxResumen.unidad; // Fastest Unit
                fuelPerformance.maxSpeed = auxResumen.velMax; // Max Speed of the unit
                fuelPerformance.initDate = fInicial;
                fuelPerformance.finalDate = fFinal;
                fuelPerformance.timeMoving = auxResumen.tiempoMov; // Time Moving
                fuelPerformance.deadTime = auxResumen.tiempoMuerto;

                if( fuelPerformance.valConsu > 0 && auxConsumido.volBruto > 0){
                    fuelPerformance.brutePerformance = fuelPerformance.valConsu/auxConsumido.volBruto ;
                }else{
                     fuelPerformance.brutePerformance = 0;
                }

                if( fuelPerformance.valConsu > 0 && auxConsumido.volEfectivo  > 0){
                    fuelPerformance.efectivePerformance = fuelPerformance.valConsu/auxConsumido.volEfectivo;
                }else{
                    fuelPerformance.efectivePerformance = 0;
                }

                /** Ur done **/

               this.Context.Response.ContentType = "application/json; charset=utf-8";

                string json = JsonConvert.SerializeObject(fuelPerformance, Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore });
                return json;
            }
            else
                return "error404";
    }
 public FuelSummaryHelper getInitialSum(List<FuelSummaryHelper> initTable)
 {
     FuelSummaryHelper result = new FuelSummaryHelper();
         int timesEvent = 0;
         double volumeSum = 0;
         foreach (FuelSummaryHelper unitSum in initTable)
         {
             volumeSum += unitSum.volumen;
         }
         result.cantEventos = timesEvent;
         result.volumen = volumeSum;
         return result;
 }
    public List<FuelSummaryHelper> getInitialFuelTable(string cliente, List<string> unidades, DateTime fInicial, DateTime fFinal, int zona)
    {
        List<FuelSummaryHelper> result = new List<FuelSummaryHelper>();
            foreach (string unidad in unidades)
            {
                FuelSummaryHelper currentRes = new FuelSummaryHelper();
                currentRes.unidad = unidad;
                currentRes.volumen = RastreoEstaticoBD.getFirstLastFuel(cliente, unidad, fInicial, fFinal, zona, true);

                result.Add(currentRes);
            }
            return result;
    }
    public List<FuelSummaryHelper> getConsumedTable(string cliente, List<string> unidades, DateTime fInicial, DateTime fFinal, List<FuelSummaryHelper> initialFuelTable, List<FuelSummaryHelper> finalFuelTable, List<FuelSummaryHelper> cargasTable, List<FuelSummaryHelper> descargasTable, List<FuelSummaryHelper> ralentiTable, int zona)
    {
        List<FuelSummaryHelper> result = new List<FuelSummaryHelper>();
            double ini = 0;
            double fin = 0;
            double cargas = 0;
            double descargas = 0;
            double ralenti = 0;

            double distanciaInicial;
            double distanciaFinal;

            for (int i = 0; i < unidades.Count; i++)
            {
                FuelSummaryHelper currentRes = new FuelSummaryHelper();
                string unidad = unidades[i];
                ini = initialFuelTable[i].volumen;
                fin = finalFuelTable[i].volumen;
                cargas = cargasTable[i].volumen;
                descargas = descargasTable[i].volumen;
                ralenti = ralentiTable[i].volumen;

                distanciaInicial = RastreoEstaticoBD.getFirstLastKm(cliente, unidad, fInicial, fFinal,zona, true );
                distanciaFinal = RastreoEstaticoBD.getFirstLastKm(cliente, unidad, fInicial, fFinal,zona, false);
                double distanciaRecorrida= distanciaFinal - distanciaInicial;

                currentRes.unidad = unidad;
                currentRes.distancia = distanciaRecorrida;

                currentRes.volEfectivo = applyConsumedEffectiveFormula(ini, fin, cargas, descargas, ralenti);
                currentRes.volBruto = applyConsumedFormulaBrute(ini, fin, cargas, descargas, ralenti);
                currentRes.volumen = currentRes.volEfectivo;

                result.Add(currentRes);
            }
            return result;
    }