using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_Ventas._1_Datos
{
    public class AUX_Datos
    {
        public decimal Obtener_Deuda(long _lng_idCliente)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            decimal dcm_Deuda=0;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;


                string str_SQL =
                    " SELECT sum((P.Total_Facturas - P.Total_Cobros) + P.Total_Devoluciones) as Deuda " +
                    " FROM " +
                    " ( " +
                            " SELECT CASE WHEN sum(" + nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.importe) + ") is null then 0 else sum(" + nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.importe) + ") end AS Total_Facturas, 0 AS Total_Cobros, 0 AS Total_Devoluciones " +
                            " FROM " + nameof(VTA_FacturasCabecera) +
                            " INNER JOIN " + nameof(VTA_Vencimientos) + " on " + nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.id) + " = " + nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.idFacturaCabecera) +
                            " WHERE " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.idCliente) + " = @idCliente AND " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.fechaBorrado) + " is null AND " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') AND " +
                                nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.fechaBorrado) + " is null  AND " +
                                nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') " +
                        " UNION ALL " +
                            " SELECT 0 AS Total_Facturas, CASE WHEN sum(" + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.importe) + ") is null then 0 else sum(" + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.importe) + ") end AS Total_Cobros, 0 AS Total_Devoluciones " +
                            " FROM " + nameof(VTA_FacturasCabecera) +
                            " INNER JOIN " + nameof(VTA_Vencimientos) + " on " + nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.id) + " = " + nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.idFacturaCabecera) +
                            " INNER JOIN " + nameof(VTA_Cobros) + " on " + nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.id) + " = " + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.idVencimiento) +
                            " WHERE " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.idCliente) + " = @idCliente AND " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.fechaBorrado) + " is null AND " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') AND " +
                                nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.fechaBorrado) + " is null  AND " +
                                nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') AND " +
                                nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.fechaBorrado) + " is null  AND " +
                                " ( " + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.mantenerPendiente) + " is null OR " + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.mantenerPendiente) + "=0  ) AND " +
                                nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') " +
                        " UNION ALL " +
                            " SELECT 0 AS Total_Facturas, 0 AS Total_Cobros, CASE WHEN sum(" + nameof(VTA_DevolucionesCobros) + "." + nameof(VTA_DevolucionesCobros.importe) + ") is null then 0 else sum(" + nameof(VTA_DevolucionesCobros) + "." + nameof(VTA_DevolucionesCobros.importe) + ") end AS Total_Devoluciones " +
                            " FROM " + nameof(VTA_FacturasCabecera) +
                            " INNER JOIN " + nameof(VTA_Vencimientos) + " on " + nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.id) + " = " + nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.idFacturaCabecera) +
                            " INNER JOIN " + nameof(VTA_Cobros) + " on " + nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.id) + " =" + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.idVencimiento) +
                            " INNER JOIN " + nameof(VTA_DevolucionesCobros) + " on " + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.id) + " = " + nameof(VTA_DevolucionesCobros) + "." + nameof(VTA_DevolucionesCobros.idCobro) +
                            " WHERE " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.idCliente) + " = @idCliente AND " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.fechaBorrado) + " is null AND " +
                                nameof(VTA_FacturasCabecera) + "." + nameof(VTA_FacturasCabecera.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') AND " +
                                nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.fechaBorrado) + " is null  AND " +
                                nameof(VTA_Vencimientos) + "." + nameof(VTA_Vencimientos.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') AND " +
                                nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.fechaBorrado) + " is null  AND " +
                                nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') AND " +
                                " ( " + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.mantenerPendiente) + " is null OR " + nameof(VTA_Cobros) + "." + nameof(VTA_Cobros.mantenerPendiente) + "=0  ) AND " +
                                nameof(VTA_DevolucionesCobros) + "." + nameof(VTA_DevolucionesCobros.fechaBorrado) + " is null  AND " +
                                nameof(VTA_DevolucionesCobros) + "." + nameof(VTA_DevolucionesCobros.estado) + " in ('" + Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO + "','" + Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO + "') " +
                    " ) AS P ";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@idCliente",  _lng_idCliente)
                };

                //Rellenar el Modelo
                decimal? dcm_Deuda_AUX = obj_Exferia_Entities.Database.SqlQuery<decimal>(str_SQL, arr_Parametros).FirstOrDefault();
                if (dcm_Deuda_AUX!=null)
                {
                    dcm_Deuda=dcm_Deuda_AUX.Value;
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(AUX_Datos) + "/" + nameof(Obtener_Deuda), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return dcm_Deuda;
        }
    }
}
