using Exferia_Aplicacion.General;
using Exferia_Controles;
using Exferia_General;
using Exferia_Ventas._0_Modelos;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_CRM._3_Vistas.Controladoras
{
    public class P_Informes_Ventas_Controladora
    {
        #region Variables Generales
        internal P_Informes_Ventas g_frm_P_Informes_Ventas;
        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo;
        #endregion Variables Generales

        public P_Informes_Ventas_Controladora(P_Informes_Ventas _frm_P_Informes_Ventas)
        {
            g_frm_P_Informes_Ventas = _frm_P_Informes_Ventas;
            g_lst_INTERNO_Permisos_Modelo = Datos_Generales.Permisos_Buscar(Variables.G_STR_OPCION_AGD_CITAS);
        }


        public void BuscarInformeTransacciones()
        {
            DateTime? dtt_desdeFecha1 = ObtenerFecha(g_frm_P_Informes_Ventas.Exferia_FechaSeleccion_PrimeraDesde);
            DateTime? dtt_hastaFecha1 = ObtenerFecha(g_frm_P_Informes_Ventas.Exferia_FechaSeleccion_PrimeraHasta);
            DateTime? dtt_desdeFecha2 = ObtenerFecha(g_frm_P_Informes_Ventas.Exferia_FechaSeleccion_SegundaDesde);
            DateTime? dtt_hastaFecha2 = ObtenerFecha(g_frm_P_Informes_Ventas.Exferia_FechaSeleccion_SegundaHasta);

            try
            {
                INTERNO_VTA_PresupuestosCabecera_InformeEntreRangos _mdl_InformeTransacciones = Obtener_InformeTransacciones(
                    dtt_desdeFecha1,
                    dtt_hastaFecha1,
                    dtt_desdeFecha2,
                    dtt_hastaFecha2);

                g_frm_P_Informes_Ventas.Exferia_Label_Tasa.Text = dtt_desdeFecha1 != null && dtt_hastaFecha1 != null && dtt_desdeFecha2 != null && dtt_hastaFecha2 != null ? string.Format("{0:0.00}", _mdl_InformeTransacciones?.Promedio) : "-";
               
                var str_primero = string.Format("{0:0.00}", _mdl_InformeTransacciones?.PromedioPrimerRango);
                var str_segundo = string.Format("{0:0.00}", _mdl_InformeTransacciones?.PromedioSegundoRango);
                g_frm_P_Informes_Ventas.Chart_Informe.Series["Comparativa entre dos rangos de fechas"].Points.Clear();
                g_frm_P_Informes_Ventas.Chart_Informe.Series["Comparativa entre dos rangos de fechas"].Points.AddXY($"Promedio primer rango ({str_primero})", str_primero);
                g_frm_P_Informes_Ventas.Chart_Informe.Series["Comparativa entre dos rangos de fechas"].Points.AddXY($"Promedio segundo rango ({str_segundo})", str_segundo);

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Informes_Ventas) + "/" + nameof(BuscarInformeTransacciones));
            }
        }
        private INTERNO_VTA_PresupuestosCabecera_InformeEntreRangos Obtener_InformeTransacciones(DateTime? dtt_desdeFecha1, DateTime? dtt_hastaFecha1, DateTime? dtt_desdeFecha2, DateTime? dtt_hastaFecha2)
        {
            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_MAE_CONTACTO_CLIENTEPOTENCIAL, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Anadir, true)))
            {
                //P_Contactos
                //Cargamos el ensamblado ##############################################################################################
                Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_VENTAS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_2 = m_assembly_2.GetType("" + Variables.G_STR_LIBRERIA_VENTAS + "." + Variables.G_STR_LIBRERIA_DATOSVENTAS);
                //Creamos la instancia
                var obj_Clase = Activator.CreateInstance(m_type_2);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_VTAPRESUPUESTOSCABECERA_OBTENER_INFORMEVENTAS, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { dtt_desdeFecha1, dtt_hastaFecha1, dtt_desdeFecha2, dtt_hastaFecha2 };

                return (INTERNO_VTA_PresupuestosCabecera_InformeEntreRangos)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            return null;
        }

        private DateTime? ObtenerFecha(Exferia_FechaSeleccion fecha)
        {
            string str_Fecha = fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/');
            int int_Fecha = Funciones.Fecha_Validacion(str_Fecha);
            return int_Fecha != 1 && int_Fecha != 2 ? (DateTime?)DateTime.ParseExact(str_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : null;
        }
    }
}
