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

namespace Exferia_Ventas._0_Modelos
{
    public class INTERNO_VTA_AlbaranesFacturasLineas_Listado_Modelo : VTA_AlbaranesFacturasLineas
    {
        #region Articulo
        public string Articulo_Codigo { get; set; }
        public long Articulo_Codigo_Long
        {
            get
            {
                long lng_Codigo = 0;
                if (Funciones.IsNumeric(Articulo_Codigo))
                {
                    lng_Codigo = long.Parse(Articulo_Codigo);
                }
                return lng_Codigo;
            }

        }
        public string Articulo_Descripcion { get; set; }
        public long? Articulo_idImpuestoTipo { get; set; }
        public GEN_ImpuestosTipos Articulo_ImpuestoTipo { get; set; }

        public long? Articulo_idRetencionTipo_Venta { get; set; }
        public GEN_RetencionesTipos Articulo_RetencionTipo_Venta { get; set; }
        public long? Articulo_idRetencionTipo_Compra { get; set; }
        public GEN_RetencionesTipos Articulo_RetencionTipo_Compra { get; set; }

        public string Articulo_TipoTrazabilidad { get; set; }
        #endregion

        #region ArticuloComodin
        public string ArticuloComodin_Codigo { get; set; }
        public long ArticuloComodin_Codigo_Long
        {
            get
            {
                long lng_Codigo = 0;
                if (Funciones.IsNumeric(ArticuloComodin_Codigo))
                {
                    lng_Codigo = long.Parse(ArticuloComodin_Codigo);
                }
                return lng_Codigo;
            }

        }
        public long? ArticuloComodin_idImpuestoTipo { get; set; }
        public GEN_ImpuestosTipos ArticuloComodin_ImpuestoTipo { get; set; }

        public long? ArticuloComodin_idRetencionTipo_Venta { get; set; }
        public GEN_RetencionesTipos ArticuloComodin_RetencionTipo_Venta { get; set; }
        public long? ArticuloComodin_idRetencionTipo_Compra { get; set; }
        public GEN_RetencionesTipos ArticuloComodin_RetencionTipo_Compra { get; set; }

        public string Articulo_ArticuloComodin_Codigo
        {
            get
            {
                string str_Aux = "";

                if (idArticulo != null)
                {
                    str_Aux = Articulo_Codigo;
                }
                else
                {
                    str_Aux = ArticuloComodin_Codigo;
                }

                return str_Aux;
            }
        }
        public string Articulo_ArticuloComodin_Descripcion
        {
            get
            {
                string str_Aux = "";

                if (idArticulo != null)
                {
                    str_Aux = Articulo_Descripcion;
                }
                else
                {
                    str_Aux = descripcionArticuloComodin;
                }

                return str_Aux;
            }
        }
        public bool EnPromocion
        {
            get
            {
                bool bol_Aux = false;

                if (idAlbaranFacturaLinea_Padre != null)
                {
                    bol_Aux = true;
                }

                return bol_Aux;
            }
        }

        public string ArticuloComodin_TipoTrazabilidad { get; set; }
        #endregion

        public string TipoTrazabilidad_Texto
        {
            get
            {
                string str_TipoTrazabilidad = Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Descripcion;

                if (Articulo_TipoTrazabilidad != null)
                {
                    //Tipo de trazabilidad OBLIGATORIA
                    if (Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                    {
                        str_TipoTrazabilidad = Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Descripcion;
                    }
                    else if (Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OPCIONAL.Codigo))
                    {
                        str_TipoTrazabilidad = Variables.G_MDL_TIPOSTRAZABILIDAD_OPCIONAL.Descripcion;
                    }
                }
                
                return str_TipoTrazabilidad;
            }
        }

        #region TipoCompraVenta
        public string TipoCompraVenta_Codigo { get; set; }
        public string TipoCompraVenta_Descripcion { get; set; }
        public string TipoCompraVenta_Opcion { get; set; }
        public DateTime? TipoCompraVenta_FechaBorrado { get; set; }
        public string TipoCompraVenta
        {
            get
            {
                string str_Aux = "";

                //Codigo
                if (TipoCompraVenta_Codigo != null && TipoCompraVenta_Codigo.Trim().Length > 0)
                {
                    str_Aux = "(" + TipoCompraVenta_Codigo + ") ";
                }

                //Descripcion
                if (TipoCompraVenta_Descripcion != null && TipoCompraVenta_Descripcion.Trim().Length > 0)
                {
                    str_Aux += TipoCompraVenta_Descripcion;
                }

                return str_Aux;
            }
        }
        #endregion

        #region Almacen
        public string Almacen_Codigo { get; set; }
        public string Almacen_Descripcion { get; set; }
        public DateTime? Almacen_FechaBorrado { get; set; }
        public string Almacen
        {
            get
            {
                string str_Aux = "";

                //Codigo
                if (Almacen_Codigo != null && Almacen_Codigo.Trim().Length > 0)
                {
                    str_Aux = "(" + Almacen_Codigo + ") ";
                }

                //Descripcion
                if (Almacen_Descripcion != null && Almacen_Descripcion.Trim().Length > 0)
                {
                    str_Aux += Almacen_Descripcion;
                }

                return str_Aux;
            }
        }
        #endregion

        #region  Embalaje principal
        public MAE_Embalajes EmbalajePrincipal_Modelo { get; set; }
        public string EmbalajePrincipal
        {
            get
            {
                string str_Aux = "";

                if (EmbalajePrincipal_Modelo != null)
                {
                    //Codigo
                    if (EmbalajePrincipal_Modelo.codigo != null && EmbalajePrincipal_Modelo.codigo.Trim().Length > 0)
                    {
                        str_Aux = "(" + EmbalajePrincipal_Modelo.codigo + ") ";
                    }

                    //Descripcion
                    if (EmbalajePrincipal_Modelo.descripcion != null && EmbalajePrincipal_Modelo.descripcion.Trim().Length > 0)
                    {
                        str_Aux += EmbalajePrincipal_Modelo.descripcion;
                    }
                }

                return str_Aux;
            }
        }
        #endregion

        #region  EmbalajeRelacional
        public MAE_Embalajes EmbalajeRelacional_Modelo { get; set; }
        public string EmbalajeRelacional
        {
            get
            {
                string str_Aux = "";

                if (EmbalajeRelacional_Modelo != null)
                {

                    //Codigo
                    if (EmbalajeRelacional_Modelo.codigo != null && EmbalajeRelacional_Modelo.codigo.Trim().Length > 0)
                    {
                        str_Aux = "(" + EmbalajeRelacional_Modelo.codigo + ") ";
                    }

                    //Descripcion
                    if (EmbalajeRelacional_Modelo.descripcion != null && EmbalajeRelacional_Modelo.descripcion.Trim().Length > 0)
                    {
                        str_Aux += EmbalajeRelacional_Modelo.descripcion;
                    }
                }

                return str_Aux;
            }
        }
        #endregion

        #region  NomenclaturaPrecio
        public MAE_NomenclaturasPrecios NomenclaturaPrecio_Modelo { get; set; }
        public string NomenclaturaPrecio
        {
            get
            {
                string str_Aux = "";

                if (NomenclaturaPrecio_Modelo != null)
                {

                    //Codigo
                    if (NomenclaturaPrecio_Modelo.codigo != null && NomenclaturaPrecio_Modelo.codigo.Trim().Length > 0)
                    {
                        str_Aux = "(" + NomenclaturaPrecio_Modelo.codigo + ") ";
                    }

                    //Descripcion
                    if (NomenclaturaPrecio_Modelo.descripcion != null && NomenclaturaPrecio_Modelo.descripcion.Trim().Length > 0)
                    {
                        str_Aux += NomenclaturaPrecio_Modelo.descripcion;
                    }
                }

                return str_Aux;
            }
        }
        #endregion

        #region Precio por SegundaUnidad
        public bool PrecioPorSegundaUnidad
        {
            get
            {
                bool bol_PrecioSegundaUnidad = false;

                //Descripcion
                if (segundaUnidad_Precio_Cantidad_SegundaUnidad != null &&
                    segundaUnidad_Precio_Cantidad_SegundaUnidad.Value == 1)
                {
                    bol_PrecioSegundaUnidad = true;
                }

                return bol_PrecioSegundaUnidad;
            }
        }
        #endregion

        #region Descuento
        public decimal Descuento
        {
            get
            {
                decimal dcm_Descuento = 0m;

                if (descuentoGeneral != null)
                {
                    dcm_Descuento = descuentoGeneral.Value;
                }
                return dcm_Descuento;
            }
        }
        #endregion

        #region  Facturas
        public long? Facturas_Numero { get; set; }
        public DateTime? Facturas_Fecha { get; set; }
        public string Facturas
        {
            get
            {
                string str_Aux = "";

                //Fecha
                if (Facturas_Fecha != null)
                {
                    str_Aux = "(" + Facturas_Fecha.Value.ToString("dd/MM/yyyy") + ") ";
                }

                //Numero
                if (Facturas_Numero != null && Facturas_Numero.Value > -1)
                {
                    str_Aux += Facturas_Numero.Value.ToString();
                }

                return str_Aux;
            }
        }
        #endregion

        public List<INTERNO_VTA_AlbaranesFacturasLineas_Comentarios_Listado_Modelo> AlbaranesFacturasLineas_Comentario_AUX { get; set; }
        public List<INTERNO_VTA_AlbaranesFacturasLineas_Trazabilidad_Listado_Modelo> AlbaranesFacturasLineas_Trazabilidad_AUX { get; set; }

        public string EstadoTrazabilidad
        {
            get
            {
                string str_Estado = "";

                //Tipo de Trazabilidad NULA o NO SINTRAZABILIDAD
                if (Articulo_TipoTrazabilidad == null || Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Codigo))
                {
                    //Si tiene alguna linea de trazabilidad estaria incorrecto
                    if (AlbaranesFacturasLineas_Trazabilidad_AUX != null &&
                        AlbaranesFacturasLineas_Trazabilidad_AUX.Count > 0 &&
                        AlbaranesFacturasLineas_Trazabilidad_AUX.Where(m => m.idAlbaranFacturaLinea.Equals(id)).ToList().Count > 0)
                    {
                        str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_INCORRECTO.Descripcion;
                    }
                }
                //Tipo de trazabilidad OBLIGATORIA
                else if (Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                {
                    if (AlbaranesFacturasLineas_Trazabilidad_AUX != null && AlbaranesFacturasLineas_Trazabilidad_AUX.Count > 0)
                    {
                        decimal dcm_CantidadPrincipal = AlbaranesFacturasLineas_Trazabilidad_AUX.Where(m => m.idAlbaranFacturaLinea.Equals(id)).Sum(m => m.cantidad);
                        decimal dcm_CantidadRelacional = AlbaranesFacturasLineas_Trazabilidad_AUX.Where(m => m.idAlbaranFacturaLinea.Equals(id) && m.segundaUnidad_cantidad != null).Sum(m => m.segundaUnidad_cantidad.Value);

                        //Si el total de la cantidadPrincipal de la trazabilidad es inferior a la cantidadPrincipal de la Linea
                        if (dcm_CantidadPrincipal < cantidad)
                        {
                            str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_SINCOMPLETAR.Descripcion;
                        }
                        //Si el total de la cantidadPrincipal de la trazabilidad es superior a la cantidadPrincipal de la Linea
                        else if (dcm_CantidadPrincipal > cantidad)
                        {
                            str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_SOBREPASADO.Descripcion;
                        }
                        else
                        {
                            str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_CORRECTO.Descripcion;
                        }
                    }
                    else
                    {
                        str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_VACIO.Descripcion;
                    }
                }
                else if (Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OPCIONAL.Codigo))
                {
                    if (AlbaranesFacturasLineas_Trazabilidad_AUX != null && AlbaranesFacturasLineas_Trazabilidad_AUX.Count > 0)
                    {
                        decimal dcm_CantidadPrincipal = AlbaranesFacturasLineas_Trazabilidad_AUX.Where(m => m.idAlbaranFacturaLinea.Equals(id)).Sum(m => m.cantidad);
                        decimal dcm_CantidadRelacional = AlbaranesFacturasLineas_Trazabilidad_AUX.Where(m => m.idAlbaranFacturaLinea.Equals(id) && m.segundaUnidad_cantidad != null).Sum(m => m.segundaUnidad_cantidad.Value);

                        //Si el total de la cantidadPrincipal de la trazabilidad es superior a la cantidadPrincipal de la Linea
                        if (dcm_CantidadPrincipal > cantidad)
                        {
                            str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_SOBREPASADO.Descripcion;
                        }
                        //Si son iguales
                        else if (dcm_CantidadPrincipal == cantidad)
                        {
                            str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_CORRECTO.Descripcion;
                        }
                        else
                        {
                            str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_NADA.Descripcion;
                        }
                    }
                    else
                    {
                        str_Estado = Variables.G_MDL_TIPOSESTADOSLINEATRAZABILIDAD_NADA.Descripcion;
                    }
                }

                return str_Estado;
            }
        }

        public int NumeroLinea_Final
        {
            get
            {
                int int_NumeroLinea = 1;

                if (numeroLineaFactura >0)
                {
                    int_NumeroLinea = numeroLineaFactura;
                }
                else if (numeroLineaAlbaran>0)
                {
                    int_NumeroLinea = numeroLineaAlbaran;
                }

                return int_NumeroLinea;
            }
        }

        #region  Delegacion
        public string Delegacion_Codigo { get; set; }
        public string Delegacion_Descripcion { get; set; }
        public DateTime? Delegacion_FechaBorrado { get; set; }
        public string Delegacion
        {
            get
            {
                string str_Aux = "";

                //Codigo
                if (Delegacion_Codigo != null && Delegacion_Codigo.Trim().Length > 0)
                {
                    str_Aux = "(" + Delegacion_Codigo + ") ";
                }

                //Descripcion
                if (Delegacion_Descripcion != null && Delegacion_Descripcion.Trim().Length > 0)
                {
                    str_Aux += Delegacion_Descripcion;
                }

                return str_Aux;
            }
        }
        #endregion

        public long? Albaran_Numero { get; set; }
    }
}