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_Inventarios._0_Modelos
{
    public class INTERNO_INV_MovimientosAlmacenLineas_Listado_Modelo : INV_MovimientosAlmacenLineas
    {
        //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 string Articulo_TipoTrazabilidad { get; set; }
        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;
            }
        }

        //Almacen Origen
        public string AlmacenOrigen_Codigo { get; set; }
        public string AlmacenOrigen_Descripcion { get; set; }
        public DateTime? AlmacenOrigen_FechaBorrado { get; set; }
        public string AlmacenOrigen
        {
            get
            {
                string str_Aux = "";

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

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

                return str_Aux;
            }
        }

        //Almacen Destino
        public string AlmacenDestino_Codigo { get; set; }
        public string AlmacenDestino_Descripcion { get; set; }
        public DateTime? AlmacenDestino_FechaBorrado { get; set; }
        public string AlmacenDestino
        {
            get
            {
                string str_Aux = "";

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

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

                return str_Aux;
            }
        }

        //Ubicacion Origen
        public string UbicacionOrigen_Codigo { get; set; }
        public string UbicacionOrigen_Descripcion { get; set; }
        public DateTime? UbicacionOrigen_FechaBorrado { get; set; }
        public string UbicacionOrigen
        {
            get
            {
                string str_Aux = "";

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

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

                return str_Aux;
            }
        }

        //Ubicacion Destino
        public string UbicacionDestino_Codigo { get; set; }
        public string UbicacionDestino_Descripcion { get; set; }
        public DateTime? UbicacionDestino_FechaBorrado { get; set; }
        public string UbicacionDestino
        {
            get
            {
                string str_Aux = "";

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

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

                return str_Aux;
            }
        }

        //Embalaje 
        public MAE_Embalajes Embalaje_Modelo { get; set; }
        public long Embalaje_Id
        {
            get
            {
                long lng_Aux = -1;

                if (Embalaje_Modelo != null)
                {
                    lng_Aux = Embalaje_Modelo.id;
                }

                return lng_Aux;
            }
        }
        public string Embalaje
        {
            get
            {
                string str_Aux = "";

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

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

                return str_Aux;
            }
        }

        //EmbalajeRelacional
        public MAE_Embalajes EmbalajeRelacional_Modelo { get; set; }
        public long EmbalajeRelacional_Id
        {
            get
            {
                long lng_Aux = -1;

                if (EmbalajeRelacional != null)
                {
                    lng_Aux = EmbalajeRelacional_Modelo.id;
                }

                return lng_Aux;
            }
        }
        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;
            }
        }


        public List<INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo> MovimientosAlmacenLineas_Trazabilidad_AUX { get; set; }
        public string EstadoTrazabilidad
        {
            get
            {
                string str_Estado = "";

                //Tipo de Trazabilidad NULA o SINTRAZABILIDAD
                if (Articulo_TipoTrazabilidad==null || Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Codigo))
                {
                    //Si tiene alguna linea de trazabilidad estaria incorrecto
                    if (MovimientosAlmacenLineas_Trazabilidad_AUX!=null && 
                        MovimientosAlmacenLineas_Trazabilidad_AUX.Count > 0 &&
                        MovimientosAlmacenLineas_Trazabilidad_AUX.Where(m=>m.idMovimientoAlmacenLinea.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 (MovimientosAlmacenLineas_Trazabilidad_AUX != null && MovimientosAlmacenLineas_Trazabilidad_AUX.Count > 0)
                    {
                        decimal dcm_CantidadPrincipal = MovimientosAlmacenLineas_Trazabilidad_AUX.Where(m=>m.idMovimientoAlmacenLinea.Equals(id)).Sum(m => m.cantidad);
                        decimal dcm_CantidadRelacional = MovimientosAlmacenLineas_Trazabilidad_AUX.Where(m=> m.idMovimientoAlmacenLinea.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 (MovimientosAlmacenLineas_Trazabilidad_AUX != null && MovimientosAlmacenLineas_Trazabilidad_AUX.Count > 0)
                    {
                        decimal dcm_CantidadPrincipal = MovimientosAlmacenLineas_Trazabilidad_AUX.Where(m => m.idMovimientoAlmacenLinea.Equals(id)).Sum(m => m.cantidad);
                        decimal dcm_CantidadRelacional = MovimientosAlmacenLineas_Trazabilidad_AUX.Where(m => m.idMovimientoAlmacenLinea.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;
            }
        }
    }
}
