using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Exferia_EntityFramework;
using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Aplicacion.Terminal;

namespace Exferia_Maestros._3_Vistas.ControlesPersonalizados_DentroPaneles
{
    public partial class CTU_P_Cliente_Terminales : UserControl
    {
        #region Propiedades Privades
        private P_Cliente g_frm_P_Cliente = null;
        private MAE_Clientes_Terminales g_mdl_MAE_Clientes_Terminales = null;
        private int g_int_Numero_Objeto = -1;
        private List<INTERNO_ComboBox_Modelo> g_lst_Tipos_INTERNO_ComboBox_Modelo=null;
        #endregion

        #region Eventos publicos
        public event EventHandler<INTERNO_EventArgs> Boton_P_Cliente_Terminales_Click;
        #endregion

        #region Constructor
        public CTU_P_Cliente_Terminales(P_Cliente _frm_P_Cliente,
                                        int _int_Numero_Objeto,
                                        MAE_Clientes_Terminales _mdl_MAE_Clientes_Terminales,
                                        List<INTERNO_ComboBox_Modelo> _lst_Tipos_INTERNO_ComboBox_Modelo)
        {
            InitializeComponent();

            try
            {
                Repintar.Empezar(this);

                g_mdl_MAE_Clientes_Terminales = _mdl_MAE_Clientes_Terminales;
                g_int_Numero_Objeto = _int_Numero_Objeto;
                g_frm_P_Cliente = _frm_P_Cliente;
                g_lst_Tipos_INTERNO_ComboBox_Modelo = _lst_Tipos_INTERNO_ComboBox_Modelo;

                ex_usc_F3_Terminal.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_GEN_TERMINALES;
                ex_usc_F3_Terminal.Exferia_F3_PantallaContenedora = _frm_P_Cliente;
                ex_usc_F3_Terminal.Exferia_F3_PRINCIPAL_BUSCARTITULO = false;
                #region Filtro solo los tipos de SigmaClientes
                //Filtrado de Opciones del Padre
                List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo = new List<INTERNO_Filtro_OpcionPadre_Modelo>();
                //Para que busque con el Filtro solo cadenas
                lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(GEN_Terminales.tipo), -1, Terminal_Opcion_Variables.G_MDL_TERMINAL_TIPO_DISPOSITIVOMOVIL_SIGMA_CLIENTE.Valor));
                //Filtros para facturas
                ex_usc_F3_Terminal.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo;
                #endregion

                //CargarDatos
                Cargar_Datos();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Cliente_Terminales) + "/" + nameof(CTU_P_Cliente_Terminales));
            }
        }
        #endregion

        #region Cargar Datos
        private void Cargar_Datos()
        {
            try
            {
                //Tipo de Terminal
                if (g_lst_Tipos_INTERNO_ComboBox_Modelo != null)
                {
                    ex_cbo_TipoTerminal.Items.Clear();
                    ex_cbo_TipoTerminal.DataSource = g_lst_Tipos_INTERNO_ComboBox_Modelo;
                    ex_cbo_TipoTerminal.SelectedIndex = 0;
                }

                if (g_mdl_MAE_Clientes_Terminales != null)
                {
                    ex_lbl_CodigoValidacion.Text = g_mdl_MAE_Clientes_Terminales.codigoValidacion;
                    ex_lbl_CodigoUnicoTerminal.Text = g_mdl_MAE_Clientes_Terminales.codigoUnicoTerminal;
                    ex_cbo_TipoTerminal.SelectedItem = g_lst_Tipos_INTERNO_ComboBox_Modelo.Where(m => m.Identificador == g_mdl_MAE_Clientes_Terminales.tipoTerminal.ToString()).FirstOrDefault();
                    ex_txt_Usuario.Text = g_mdl_MAE_Clientes_Terminales.usuario;
                    ex_txt_Clave.Text = g_mdl_MAE_Clientes_Terminales.clave;
                    ex_txt_Duracion.Text = g_mdl_MAE_Clientes_Terminales.duracion.ToString();
                    ex_txt_Observaciones.Text = g_mdl_MAE_Clientes_Terminales.observaciones.ToString();

                    if (g_mdl_MAE_Clientes_Terminales.GEN_Terminales!=null)
                    {
                        ex_usc_F3_Terminal.Exferia_F3_Id = g_mdl_MAE_Clientes_Terminales.GEN_Terminales.id;
                        ex_usc_F3_Terminal.Exferia_F3_Codigo = g_mdl_MAE_Clientes_Terminales.GEN_Terminales.codigo;
                        ex_usc_F3_Terminal.Exferia_F3_Descripcion = g_mdl_MAE_Clientes_Terminales.GEN_Terminales.descripcion;
                        ex_usc_F3_Terminal.Exferia_F3_FechaBorrado = g_mdl_MAE_Clientes_Terminales.GEN_Terminales.fechaBorrado;
                    }

                    //Si esta ya ha sido utilizada se bloquea todo
                    if (g_mdl_MAE_Clientes_Terminales.utilizado)
                    {
                        ex_cbo_TipoTerminal.Enabled = false;
                        ex_txt_Usuario.Exferia_TextBox_ReadOnly = true;
                        ex_txt_Clave.Exferia_TextBox_ReadOnly = true;
                        ex_txt_Duracion.Exferia_TextBox_ReadOnly = true;

                        ex_lbl_Activado.Visible = true;
                        ex_usc_F3_Terminal.Enabled = false;

                        ex_lbl_FechaHoraActivacion.Text = g_mdl_MAE_Clientes_Terminales.fechaHoraActivacion != null ? g_mdl_MAE_Clientes_Terminales.fechaHoraActivacion.Value.ToString("dd/MM/yyyy HH:mm") : "";
                        ex_lbl_Fabricante.Text = g_mdl_MAE_Clientes_Terminales.dispositivo_Fabricante;
                        ex_lbl_Marca.Text = g_mdl_MAE_Clientes_Terminales.dispositivo_Marca;
                        ex_lbl_Modelo.Text = g_mdl_MAE_Clientes_Terminales.dispositivo_Modelo;
                        ex_lbl_MAC.Text = g_mdl_MAE_Clientes_Terminales.dispositivo_MAC;
                        ex_lbl_IP.Text = g_mdl_MAE_Clientes_Terminales.ip;
                    }

                }
                else
                {
                    //Crear el Codigo de Terminal
                    TimeSpan span = DateTime.Now.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
                    ex_lbl_CodigoValidacion.Text= span.TotalSeconds.ToString().Replace(",","");

                    //Crear el Codigo Unico de Validacion
                    ex_lbl_CodigoUnicoTerminal.Text = Guid.NewGuid().ToString();

                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Cliente_Terminales) + "/" + nameof(Cargar_Datos));
            }
        }
        #endregion

        #region Validacion
        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Terminal no puede estar Vacio (Obligatorio)
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && ex_usc_F3_Terminal.Exferia_F3_Codigo.Trim().Length == 0 &&
                    ex_usc_F3_Terminal.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_usc_F3_Terminal.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Terminal.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }
                // Si hay Terminal validar que es Correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (ex_usc_F3_Terminal.Exferia_F3_Codigo.Trim().Length != 0 ||
                    ex_usc_F3_Terminal.Exferia_F3_Descripcion.Trim().Length != 0) && ex_usc_F3_Terminal.Exferia_F3_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_Terminal.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Terminal.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //El usuario no puede estar vacio
                if ((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) && (ex_txt_Usuario.Text.Trim().Length == 0))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_lbl_Usuario.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_txt_Usuario;
                }

                //La clave no puede estar vacia
                if ((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) && (ex_txt_Clave.Text.Trim().Length == 0))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_lbl_Clave.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_txt_Clave;
                }

                //La duracion no puede estar vacia
                if ((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) && (ex_txt_Duracion.Text.Trim().Length == 0))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_lbl_Duracion.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_txt_Duracion;
                }

                //La duracion debe ser mayor que 0
                if ((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) && int.Parse(ex_txt_Duracion.Text.Trim())<1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CERO(ex_lbl_Duracion.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_txt_Duracion;
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Cliente_Terminales) + "/" + nameof(ValidarDatos));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Grabar
        public MAE_Clientes_Terminales Obtener_Para_Grabar(long _lng_idCliente)
        {
            MAE_Clientes_Terminales mdl_MAE_Clientes_Terminales = new MAE_Clientes_Terminales();

            try
            {
                DateTime? dtt_Nula = null;

                mdl_MAE_Clientes_Terminales.id = g_mdl_MAE_Clientes_Terminales!=null ? g_mdl_MAE_Clientes_Terminales.id : -1;
                mdl_MAE_Clientes_Terminales.idCliente = _lng_idCliente;
                mdl_MAE_Clientes_Terminales.codigoValidacion = ex_lbl_CodigoValidacion.Text;
                mdl_MAE_Clientes_Terminales.codigoUnicoTerminal = ex_lbl_CodigoUnicoTerminal.Text;
                mdl_MAE_Clientes_Terminales.tipoTerminal = int.Parse(((INTERNO_ComboBox_Modelo)ex_cbo_TipoTerminal.SelectedItem).Identificador);
                mdl_MAE_Clientes_Terminales.usuario = ex_txt_Usuario.Text;
                mdl_MAE_Clientes_Terminales.clave = ex_txt_Clave.Text;
                mdl_MAE_Clientes_Terminales.utilizado = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.utilizado : false;
                mdl_MAE_Clientes_Terminales.patron = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.patron : null;
                mdl_MAE_Clientes_Terminales.fechaHoraActivacion = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.fechaHoraActivacion : dtt_Nula;
                mdl_MAE_Clientes_Terminales.dispositivo_Fabricante = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.dispositivo_Fabricante : null;
                mdl_MAE_Clientes_Terminales.dispositivo_Marca = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.dispositivo_Marca : null;
                mdl_MAE_Clientes_Terminales.dispositivo_Modelo = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.dispositivo_Modelo : null;
                mdl_MAE_Clientes_Terminales.dispositivo_MAC = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.dispositivo_MAC : null;
                mdl_MAE_Clientes_Terminales.ip = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.ip : null;
                mdl_MAE_Clientes_Terminales.duracion =int.Parse(ex_txt_Duracion.Text);
                mdl_MAE_Clientes_Terminales.duracion_FechaHoraServidor = g_mdl_MAE_Clientes_Terminales != null ? g_mdl_MAE_Clientes_Terminales.duracion_FechaHoraServidor : DateTime.Now;//La fecha si es nueva se pone al insertar el registro en base de datos
                mdl_MAE_Clientes_Terminales.observaciones = ex_txt_Observaciones.Text;
                mdl_MAE_Clientes_Terminales.idTerminal = ex_usc_F3_Terminal.Exferia_F3_Id;
                mdl_MAE_Clientes_Terminales.fechaBorrado = dtt_Nula;
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Cliente_Terminales) + "/" + nameof(Obtener_Para_Grabar));
            }

            return mdl_MAE_Clientes_Terminales;
        }
      
        #endregion


        #region Borrar
        private void ex_btn_CTU_P_Clientes_Terminales_Borrar_Click(object sender, EventArgs e)
        {
            Boton_P_Cliente_Terminales_Click?.Invoke(sender, new INTERNO_EventArgs(g_int_Numero_Objeto));
        }
        #endregion
    }
}
