public static void EliminarCargaCombustible(ProyectoAutoContext _db, int _idAuto, int _idCargaOriginal)
        {
            //Actualizar historial general auto, proveedor y carga siguiente

            Auto auto = _db.Autos.Where(a => a.Id == _idAuto).FirstOrDefault();
            HistorialCargaCombustible        cargaOriginal = auto.CargasCombustible.Where(hcc => hcc.Id == _idCargaOriginal).FirstOrDefault();
            List <HistorialCargaCombustible> otrasCargas   = auto.CargasCombustible.OrderBy(h => h.FechaHora).ToList();

            HistorialCargaCombustible cargaAnterior  = null;
            HistorialCargaCombustible cargaSiguiente = null;

            for (int i = 0; i < otrasCargas.Count; i++)
            {
                if (otrasCargas[i].Id == cargaOriginal.Id)
                {
                    if ((i + 1) < otrasCargas.Count)
                    {
                        cargaSiguiente = otrasCargas[i + 1];
                    }
                    if ((i - 1) >= 0)
                    {
                        cargaAnterior = otrasCargas[i - 1];
                    }
                }
            }

            auto.LitrosTotalesConsumidos = auto.LitrosTotalesConsumidos - cargaOriginal.CantidadLitros;
            auto.CostoTotalCombustible   = auto.CostoTotalCombustible - cargaOriginal.CostoTotal;

            #region Actualizar proveedor

            if (cargaOriginal.Proveedor != null)
            {
                cargaOriginal.Proveedor.GastoTotalCombustible -= cargaOriginal.CostoTotal;
            }

            #endregion

            #region Actualizar Carga siguiente
            if (cargaSiguiente != null)
            {
                if (cargaAnterior == null)
                {
                    cargaSiguiente.KilometrosRecorridos = -1;
                    cargaSiguiente.CostoPorKilometro    = -1;
                    cargaSiguiente.Rendimiento          = -1;
                }
                else
                {
                    float kilometrosRecorridos = cargaSiguiente.Kilometraje - cargaAnterior.Kilometraje;
                    float costoPorKilometro    = cargaAnterior.CostoTotal / kilometrosRecorridos;
                    float rendimiento          = kilometrosRecorridos / cargaAnterior.CantidadLitros;

                    cargaSiguiente.KilometrosRecorridos = kilometrosRecorridos;
                    cargaSiguiente.CostoPorKilometro    = costoPorKilometro;
                    cargaSiguiente.Rendimiento          = rendimiento;
                }
            }
            #endregion

            auto.CargasCombustible.Remove(cargaOriginal);
            _db.SaveChanges();

            //Actulaizar auto luego de ser eliminado el historial
            #region Actualizar datos del auto

            if (otrasCargas.Count > 1)
            {
                int primerKilometraje   = otrasCargas.First().Kilometraje;
                int ultimoKilometraje   = otrasCargas.Last().Kilometraje;
                int kilometrosRecorrido = ultimoKilometraje - primerKilometraje;

                auto.RendimientoPromedio    = kilometrosRecorrido / auto.LitrosTotalesConsumidos;        //Kilometros por litro
                auto.CostoKilometroPromedio = auto.CostoTotalCombustible / kilometrosRecorrido;          //Costo por kilometro
                auto.CostoLitroPromedio     = auto.CostoTotalCombustible / auto.LitrosTotalesConsumidos; //Costo por litro
            }

            auto.KilometrajeActual = otrasCargas.Last().Kilometraje;
            #endregion

            _db.SaveChanges();
        }
        }                                      //Kilometros por litro


        public static void NuevaCargaCombustible(ProyectoAutoContext _db, int _idAuto,
                                                 DateTime _fecha, DateTime _hora, bool _estanqueLleno,
                                                 float _cantidadLitros, int _costoUnitario, int _Kilometraje, Proveedor _proveedor,
                                                 string _rut, int _nBoleta)
        {
            Auto auto = _db.Autos.Where(a => a.Id == _idAuto).FirstOrDefault();
            List <HistorialCargaCombustible> otrasCargas = auto.CargasCombustible.OrderBy(h => h.FechaHora).ToList();
            int costoTotal = Convert.ToInt32(_costoUnitario * _cantidadLitros);

            #region Actualizar datos del auto


            if (otrasCargas.Count > 0)
            {
                int primerKilometraje   = otrasCargas.First().Kilometraje;
                int ultimoKilometraje   = _Kilometraje;
                int kilometrosRecorrido = ultimoKilometraje - primerKilometraje;

                auto.RendimientoPromedio    = kilometrosRecorrido / auto.LitrosTotalesConsumidos;        //Kilometros por litro
                auto.CostoKilometroPromedio = auto.CostoTotalCombustible / kilometrosRecorrido;          //Costo por kilometro
                auto.CostoLitroPromedio     = auto.CostoTotalCombustible / auto.LitrosTotalesConsumidos; //Costo por litro
            }

            auto.KilometrajeActual        = _Kilometraje;
            auto.LitrosTotalesConsumidos += _cantidadLitros;
            auto.CostoTotalCombustible   += costoTotal;
            #endregion

            #region Actualizar Proveedor
            if (_proveedor != null)
            {
                _proveedor.GastoTotalCombustible += costoTotal;
            }
            #endregion

            float kilometrosRecorridos = -1;
            float costoPorKilometro    = -1;
            float rendimiento          = -1;

            Operador operador = null;
            if (auto.OperadorId != null)
            {
                operador = auto.Operador;
            }


            if (otrasCargas.Count > 0)
            {
                HistorialCargaCombustible ultimaCarga = otrasCargas.Last();

                kilometrosRecorridos = _Kilometraje - ultimaCarga.Kilometraje;
                costoPorKilometro    = ultimaCarga.CostoTotal / kilometrosRecorridos;
                rendimiento          = kilometrosRecorridos / ultimaCarga.CantidadLitros;
            }

            DateTime fecha = new DateTime(_fecha.Year, _fecha.Month, _fecha.Day, _hora.Hour, _hora.Minute, _hora.Second);

            HistorialCargaCombustible nuevaCarga = new HistorialCargaCombustible();
            nuevaCarga.FechaHora      = fecha;
            nuevaCarga.EstanqueLleno  = _estanqueLleno;
            nuevaCarga.CantidadLitros = _cantidadLitros;
            nuevaCarga.CostoUnitario  = _costoUnitario;
            nuevaCarga.Kilometraje    = _Kilometraje;
            nuevaCarga.CostoTotal     = costoTotal;
            nuevaCarga.Proveedor      = _proveedor;
            nuevaCarga.Operador       = operador;
            nuevaCarga.RutEstacion    = _rut;
            nuevaCarga.NumeroDeBoleta = _nBoleta;

            nuevaCarga.KilometrosRecorridos = kilometrosRecorridos;
            nuevaCarga.CostoPorKilometro    = costoPorKilometro;
            nuevaCarga.Rendimiento          = rendimiento;
            auto.CargasCombustible.Add(nuevaCarga);


            _db.SaveChanges();
        }
        public static void EditarCargaCombustible(ProyectoAutoContext _db, int _idAuto, int _idCargaOriginal,
                                                  DateTime _fecha, DateTime _hora, bool _estanqueLleno,
                                                  float _cantidadLitros, int _costoUnitario, int _Kilometraje, Proveedor _proveedor,
                                                  string _rut, int _nBoleta)
        {
            //considerar edicion de historial general del auto y el proveedor
            // editar tambien kilometros recorridos, costo por kilometro, rendimiento DE ESTE Y EL SIGUIENTE HISTORIAL


            Auto auto = _db.Autos.Where(a => a.Id == _idAuto).FirstOrDefault();
            HistorialCargaCombustible        cargaOriginal = auto.CargasCombustible.Where(hcc => hcc.Id == _idCargaOriginal).FirstOrDefault();
            List <HistorialCargaCombustible> otrasCargas   = auto.CargasCombustible.OrderBy(h => h.FechaHora).ToList();
            int costoTotal = Convert.ToInt32(_costoUnitario * _cantidadLitros);

            HistorialCargaCombustible cargaAnterior  = null;
            HistorialCargaCombustible cargaSiguiente = null;

            for (int i = 0; i < otrasCargas.Count; i++)
            {
                if (otrasCargas[i].Id == cargaOriginal.Id)
                {
                    if ((i + 1) < otrasCargas.Count)
                    {
                        cargaSiguiente = otrasCargas[i + 1];
                    }
                    if ((i - 1) >= 0)
                    {
                        cargaAnterior = otrasCargas[i - 1];
                    }
                }
            }

            //Datos de auto que deberian cambiar de inmediato
            auto.LitrosTotalesConsumidos += _cantidadLitros - cargaOriginal.CantidadLitros;
            auto.CostoTotalCombustible   += costoTotal - cargaOriginal.CostoTotal;

            #region Actualizar viejo y nuevo Proveedor
            Proveedor provAnterior = cargaOriginal.Proveedor;
            Proveedor provNuevo    = _proveedor;

            if (provAnterior != null)
            {
                provAnterior.GastoTotalCombustible -= cargaOriginal.CostoTotal;
            }
            if (provNuevo != null)
            {
                provNuevo.GastoTotalCombustible += costoTotal;
            }

            #endregion

            #region Actualizar Datos de la carga original
            float kilometrosRecorridos = -1;
            float costoPorKilometro    = -1;
            float rendimiento          = -1;

            if (cargaAnterior != null)
            {
                kilometrosRecorridos = _Kilometraje - cargaAnterior.Kilometraje;
                costoPorKilometro    = cargaAnterior.CostoTotal / kilometrosRecorridos;
                rendimiento          = kilometrosRecorridos / cargaAnterior.CantidadLitros;
            }

            DateTime fecha = new DateTime(_fecha.Year, _fecha.Month, _fecha.Day, _hora.Hour, _hora.Minute, _hora.Second);
            cargaOriginal.FechaHora      = fecha;
            cargaOriginal.EstanqueLleno  = _estanqueLleno;
            cargaOriginal.CantidadLitros = _cantidadLitros;
            cargaOriginal.CostoUnitario  = _costoUnitario;
            cargaOriginal.Kilometraje    = _Kilometraje;
            cargaOriginal.CostoTotal     = costoTotal;
            cargaOriginal.Proveedor      = _proveedor;
            cargaOriginal.RutEstacion    = _rut;
            cargaOriginal.NumeroDeBoleta = _nBoleta;

            cargaOriginal.KilometrosRecorridos = kilometrosRecorridos;
            cargaOriginal.CostoPorKilometro    = costoPorKilometro;
            cargaOriginal.Rendimiento          = rendimiento;

            _db.SaveChanges();
            #endregion

            #region Actualizar Datos de la siguiente carga

            if (cargaSiguiente != null)
            {
                kilometrosRecorridos = cargaSiguiente.Kilometraje - cargaOriginal.Kilometraje;
                costoPorKilometro    = cargaOriginal.CostoTotal / kilometrosRecorridos;
                rendimiento          = kilometrosRecorridos / cargaOriginal.CantidadLitros;

                cargaSiguiente.KilometrosRecorridos = kilometrosRecorridos;
                cargaSiguiente.CostoPorKilometro    = costoPorKilometro;
                cargaSiguiente.Rendimiento          = rendimiento;
            }

            #endregion

            //datos del auto se actualizan al final cuando los hitoriales ya se regulan
            #region Actualizar datos del auto

            if (otrasCargas.Count > 1)
            {
                int primerKilometraje   = otrasCargas.First().Kilometraje;
                int ultimoKilometraje   = otrasCargas.Last().Kilometraje;
                int kilometrosRecorrido = ultimoKilometraje - primerKilometraje;

                auto.RendimientoPromedio    = kilometrosRecorrido / auto.LitrosTotalesConsumidos;        //Kilometros por litro
                auto.CostoKilometroPromedio = auto.CostoTotalCombustible / kilometrosRecorrido;          //Costo por kilometro
                auto.CostoLitroPromedio     = auto.CostoTotalCombustible / auto.LitrosTotalesConsumidos; //Costo por litro
            }

            auto.KilometrajeActual = otrasCargas.Last().Kilometraje;
            #endregion

            _db.SaveChanges();
        }