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_Aplicacion.General;
using Exferia_Formularios;
using Exferia_EntityFramework;
using Exferia_General.General;
using Exferia_Aplicacion.Visualizacion;

namespace Exferia_Controles
{
    public partial class Exferia_DireccionFiscal : UserControl
    {
        #region Propiedades Privadas
        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_TipoNumeracion = null;
        private GEN_Direcciones g_mdl_GEN_Direcciones = null;
        private int g_int_TipoDireccion;
        #endregion

        #region Propiedades Publicas
        public string Exferia_F3_Pais_Codigo
        {
            get
            {
                return ex_usc_F3_Pais.Exferia_F3_Codigo;
            }
        }
        public int int_TIPODIRECCION
        {
            get
            {
                return g_int_TipoDireccion;
            }
            set
            {
                g_int_TipoDireccion = value;
            }
        }

        //Objetos Exferia_Direccion Relacionados
        internal List<Exferia_Direccion> g_lst_Exferia_Direccion;
        public List<Exferia_Direccion> Exferia_Direccion_RELACIONADOS_Objeto
        {
            get
            {
                return g_lst_Exferia_Direccion;
            }
            set
            {
                g_lst_Exferia_Direccion = value;
            }
        }

        //Objetos Exferia_DireccionFiscal Relacionados
        internal List<Exferia_DireccionFiscal> g_lst_Exferia_DireccionFiscal;
        public List<Exferia_DireccionFiscal> Exferia_DireccionFiscal_RELACIONADOS_Objeto
        {
            get
            {
                return g_lst_Exferia_DireccionFiscal;
            }
            set
            {
                g_lst_Exferia_DireccionFiscal = value;
            }
        }
        #endregion

        #region Eventos Publicos
        public event EventHandler<INTERNO_EventArgs> boton_Copiar_Click;

        public event EventHandler<INTERNO_EventArgs_String> Exferia_DireccionFiscal_Pais_Actualizado;
        #endregion

        public Exferia_DireccionFiscal()
        {
            InitializeComponent();

            Repintar.Empezar(this);
        }
        
        public void ActualizarRegistros(P_Base _frm_Pantalla_DeDondeHereda)
        {
            try
            {
                //Pais
                ex_usc_F3_Pais.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_GEN_PAIS;
                ex_usc_F3_Pais.Exferia_F3_PantallaContenedora = _frm_Pantalla_DeDondeHereda;

                //Provincia
                ex_usc_F3_Provincia.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_GEN_PROVINCIA;
                ex_usc_F3_Provincia.Exferia_F3_PantallaContenedora = _frm_Pantalla_DeDondeHereda;

                //Municipio
                ex_usc_F3_Municipio.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_GEN_MUNICIPIO;
                ex_usc_F3_Municipio.Exferia_F3_PantallaContenedora = _frm_Pantalla_DeDondeHereda;

                //Poblacion
                ex_usc_F3_Poblacion.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_GEN_POBLACION;
                ex_usc_F3_Poblacion.Exferia_F3_PantallaContenedora = _frm_Pantalla_DeDondeHereda;

                //Tipo de via
                ex_usc_F3_TipoVia.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_GEN_TIPOVIA;
                ex_usc_F3_TipoVia.Exferia_F3_PantallaContenedora = _frm_Pantalla_DeDondeHereda;

                //Combo de Tipo de Numeracion
                g_lst_INTERNO_ComboBox_Modelo_TipoNumeracion = ListadosEstaticos.Listado_Tipo_Numeracion();
                ex_cbo_TipoNumeracion.DataSource = g_lst_INTERNO_ComboBox_Modelo_TipoNumeracion;
                ex_cbo_TipoNumeracion.SelectedIndex = 0;
            
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Exferia_DireccionFiscal) + "" + nameof(Exferia_DireccionFiscal));
            }
        }

        public void CargarDatos(GEN_Direcciones _mdl_GEN_Direcciones)
        {
            try
            {
                g_mdl_GEN_Direcciones = _mdl_GEN_Direcciones;

                //Paises
                ex_usc_F3_Pais.Exferia_F3_Id = _mdl_GEN_Direcciones.GEN_Paises.id;
                ex_usc_F3_Pais.Exferia_F3_Codigo = _mdl_GEN_Direcciones.GEN_Paises.codigo_ISO2D;
                ex_usc_F3_Pais.Exferia_F3_Descripcion = _mdl_GEN_Direcciones.GEN_Paises.descripcion;
                ex_usc_F3_Pais.Exferia_F3_FechaBorrado = _mdl_GEN_Direcciones.GEN_Paises.fechaBorrado;

                //Provincia
                ex_usc_F3_Provincia.Exferia_F3_Id = _mdl_GEN_Direcciones.GEN_Provincias.id;
                ex_usc_F3_Provincia.Exferia_F3_Codigo = _mdl_GEN_Direcciones.GEN_Provincias.codigo;
                ex_usc_F3_Provincia.Exferia_F3_Descripcion = _mdl_GEN_Direcciones.GEN_Provincias.descripcion;
                ex_usc_F3_Provincia.Exferia_F3_FechaBorrado = _mdl_GEN_Direcciones.GEN_Provincias.fechaBorrado;

                //Municipios
                if (_mdl_GEN_Direcciones.GEN_Municipios!=null)
                { 
                    ex_usc_F3_Municipio.Exferia_F3_Id = _mdl_GEN_Direcciones.GEN_Municipios.id;
                    ex_usc_F3_Municipio.Exferia_F3_Codigo = _mdl_GEN_Direcciones.GEN_Municipios.codigoINE;
                    ex_usc_F3_Municipio.Exferia_F3_Descripcion = _mdl_GEN_Direcciones.GEN_Municipios.descripcion;
                    ex_usc_F3_Municipio.Exferia_F3_FechaBorrado = _mdl_GEN_Direcciones.GEN_Municipios.fechaBorrado;
                }

                //Poblaciones
                if (_mdl_GEN_Direcciones.GEN_Poblaciones != null)
                {
                    ex_usc_F3_Poblacion.Exferia_F3_Id = _mdl_GEN_Direcciones.GEN_Poblaciones.id;
                    ex_usc_F3_Poblacion.Exferia_F3_Codigo = _mdl_GEN_Direcciones.GEN_Poblaciones.codigo;
                    ex_usc_F3_Poblacion.Exferia_F3_Descripcion = _mdl_GEN_Direcciones.GEN_Poblaciones.descripcion;
                    ex_usc_F3_Poblacion.Exferia_F3_FechaBorrado = _mdl_GEN_Direcciones.GEN_Poblaciones.fechaBorrado;
                }

                //Tipo de Via
                if (_mdl_GEN_Direcciones.GEN_TiposVias != null)
                {
                    ex_usc_F3_TipoVia.Exferia_F3_Id = _mdl_GEN_Direcciones.GEN_TiposVias.id;
                    ex_usc_F3_TipoVia.Exferia_F3_Codigo = _mdl_GEN_Direcciones.GEN_TiposVias.codigoINE;
                    ex_usc_F3_TipoVia.Exferia_F3_Descripcion = _mdl_GEN_Direcciones.GEN_TiposVias.descripcion;
                    ex_usc_F3_TipoVia.Exferia_F3_FechaBorrado = _mdl_GEN_Direcciones.GEN_TiposVias.fechaBorrado;
                }

                ex_txt_Bloque.Text = _mdl_GEN_Direcciones.bloque;
                ex_txt_Calificador.Text = _mdl_GEN_Direcciones.calificadorNumero;
                ex_txt_CodigoPostal.Text = _mdl_GEN_Direcciones.codigoPostal;
                ex_txt_DatosComplementarios.Text = _mdl_GEN_Direcciones.datosComplementariosDomicilio;
                ex_txt_Escalera.Text = _mdl_GEN_Direcciones.escalera;
                ex_txt_NombreVia.Text = _mdl_GEN_Direcciones.nombreVia;
                ex_txt_NumeroCasa.Text = _mdl_GEN_Direcciones.numeroCasa;
                ex_txt_Planta.Text = _mdl_GEN_Direcciones.planta;
                ex_txt_Portal.Text = _mdl_GEN_Direcciones.portal;
                ex_txt_Puerta.Text = _mdl_GEN_Direcciones.puerta;

                //Por el index se puede sacar ya que el listado que cargo es el mismo que filtro y los index coinciden y porque por el puto item no me lo coge
                ex_cbo_TipoNumeracion.SelectedIndex = g_lst_INTERNO_ComboBox_Modelo_TipoNumeracion.IndexOf(g_lst_INTERNO_ComboBox_Modelo_TipoNumeracion.Where(m=>m.Identificador.Equals(_mdl_GEN_Direcciones.tipoNumeracion)).FirstOrDefault());

                //Actualzar los datos de la Provincia,Municipios y Poblaciones, para ver si se desbloquea
                Actualizar_Provincia(false);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Exferia_DireccionFiscal) + "/" + nameof(CargarDatos));
            }
        }

        public void VaciarDatos()
        {
            g_mdl_GEN_Direcciones = null;

            ex_usc_F3_Pais.Exferia_F3_Id = -1;
            ex_usc_F3_Pais.Exferia_F3_Codigo = string.Empty;
            ex_usc_F3_Pais.Exferia_F3_Descripcion = string.Empty;
            ex_usc_F3_Pais.Exferia_F3_FechaBorrado = null;

            Actualizar_Provincia(true);

            ex_usc_F3_TipoVia.Exferia_F3_Id = -1;
            ex_usc_F3_TipoVia.Exferia_F3_Codigo = string.Empty;
            ex_usc_F3_TipoVia.Exferia_F3_Descripcion = string.Empty;
            ex_usc_F3_TipoVia.Exferia_F3_FechaBorrado = null;

            ex_txt_Bloque.Text = "";
            ex_txt_Calificador.Text = "";
            ex_txt_CodigoPostal.Text = "";
            ex_txt_DatosComplementarios.Text = "";
            ex_txt_Escalera.Text = "";
            ex_txt_NombreVia.Text = "";
            ex_txt_NumeroCasa.Text = "";
            ex_txt_Planta.Text = "";
            ex_txt_Portal.Text = "";
            ex_txt_Puerta.Text = "";

            ex_cbo_TipoNumeracion.SelectedItem = null;
        }

        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Solo validar si tiene algun datos introducido
            if (ex_txt_CodigoPostal.Text.Trim().Length > 0 ||
                ex_txt_Calificador.Text.Trim().Length > 0 ||
                ex_txt_NumeroCasa.Text.Trim().Length > 0 ||
                ex_txt_Bloque.Text.Trim().Length > 0 ||
                ex_txt_Portal.Text.Trim().Length > 0 ||
                ex_txt_Escalera.Text.Trim().Length > 0 ||
                ex_txt_Planta.Text.Trim().Length > 0 ||
                ex_txt_Puerta.Text.Trim().Length > 0 ||
                ex_txt_DatosComplementarios.Text.Trim().Length > 0 ||
                ex_usc_F3_Pais.Exferia_F3_Codigo.Trim().Length > 0 ||
                ex_usc_F3_Pais.Exferia_F3_Descripcion.Trim().Length > 0 ||
                ex_usc_F3_Provincia.Exferia_F3_Codigo.Trim().Length > 0 ||
                ex_usc_F3_Provincia.Exferia_F3_Descripcion.Trim().Length > 0 ||
                ex_usc_F3_Municipio.Exferia_F3_Codigo.Trim().Length > 0 ||
                ex_usc_F3_Municipio.Exferia_F3_Descripcion.Trim().Length > 0 ||
                ex_usc_F3_Poblacion.Exferia_F3_Codigo.Trim().Length > 0 ||
                ex_usc_F3_Poblacion.Exferia_F3_Descripcion.Trim().Length > 0 ||
                ex_usc_F3_TipoVia.Exferia_F3_Codigo.Trim().Length > 0 ||
                ex_usc_F3_TipoVia.Exferia_F3_Descripcion.Trim().Length > 0)
            {
                
                // El país no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && ex_usc_F3_Pais.Exferia_F3_Codigo.Trim().Length == 0 &&
                    ex_usc_F3_Pais.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_usc_F3_Pais.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Pais.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay país validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (ex_usc_F3_Pais.Exferia_F3_Codigo.Trim().Length != 0 ||
                    ex_usc_F3_Pais.Exferia_F3_Descripcion.Trim().Length != 0) && ex_usc_F3_Pais.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_Pais.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Pais.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // La provincia no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && ex_usc_F3_Provincia.Exferia_F3_Codigo.Trim().Length == 0 &&
                    ex_usc_F3_Provincia.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_usc_F3_Provincia.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Provincia.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay provincia validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (ex_usc_F3_Provincia.Exferia_F3_Codigo.Trim().Length != 0 ||
                    ex_usc_F3_Provincia.Exferia_F3_Descripcion.Trim().Length != 0) && ex_usc_F3_Provincia.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_Provincia.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Provincia.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Municipio validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (ex_usc_F3_Municipio.Exferia_F3_Codigo.Trim().Length != 0 ||
                    ex_usc_F3_Municipio.Exferia_F3_Descripcion.Trim().Length != 0) && ex_usc_F3_Municipio.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_Municipio.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Municipio.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Poblacion validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (ex_usc_F3_Poblacion.Exferia_F3_Codigo.Trim().Length != 0 ||
                    ex_usc_F3_Poblacion.Exferia_F3_Descripcion.Trim().Length != 0) && ex_usc_F3_Poblacion.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_Poblacion.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Poblacion.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Tipo de via validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (ex_usc_F3_TipoVia.Exferia_F3_Codigo.Trim().Length != 0 ||
                    ex_usc_F3_TipoVia.Exferia_F3_Descripcion.Trim().Length != 0) && ex_usc_F3_TipoVia.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_TipoVia.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_usc_F3_TipoVia.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }
            }

            return mdl_ValorDevuelto_Modelo;
        }

        #region GRABAR
        public GEN_Direcciones Obtener_Modelo_Para_Grabacion(string _str_TipoDireccion,
                                                       long? _lng_idCliente,
                                                       long? _lng_idProveedor,
                                                       long? _lng_idEmpleado,
                                                       long? _lng_idSocio,
                                                       long? _lng_idEmpresa)
        {
            return Obtener_Modelo_Para_Grabacion(_str_TipoDireccion,
                                           _lng_idCliente,
                                           _lng_idProveedor,
                                           _lng_idEmpleado,
                                           _lng_idSocio,
                                           _lng_idEmpresa,
                                           null,
                                           null,
                                           null);
        }
        public GEN_Direcciones Obtener_Modelo_Para_Grabacion( string _str_TipoDireccion, 
                                                        long? _lng_idCliente,
                                                        long? _lng_idProveedor,
                                                        long? _lng_idEmpleado,
                                                        long? _lng_idSocio,
                                                        long? _lng_idEmpresa,
                                                        long? _lng_EmpresaInstaladora,
                                                        long? _lng_OrganismoCentificador)
        {
            return Obtener_Modelo_Para_Grabacion(_str_TipoDireccion,
                                          _lng_idCliente,
                                          _lng_idProveedor,
                                          _lng_idEmpleado,
                                          _lng_idSocio,
                                          _lng_idEmpresa,
                                          null,
                                          _lng_OrganismoCentificador,
                                          null);
        }
        public GEN_Direcciones Obtener_Modelo_Para_Grabacion(string _str_TipoDireccion,
                                                        long? _lng_idCliente,
                                                        long? _lng_idProveedor,
                                                        long? _lng_idEmpleado,
                                                        long? _lng_idSocio,
                                                        long? _lng_idEmpresa,
                                                        long? _lng_EmpresaInstaladora,
                                                        long? _lng_OrganismoCentificador,
                                                        long? _lng_idAgenciaHermes)
        {
            GEN_Direcciones mdl_GEN_Direcciones = new GEN_Direcciones();
            mdl_GEN_Direcciones.id = g_mdl_GEN_Direcciones != null ? g_mdl_GEN_Direcciones.id : -1;

            if (ex_txt_NombreVia.Text.Trim().Length > 0)
            {
                mdl_GEN_Direcciones.idCliente = _lng_idCliente;
                mdl_GEN_Direcciones.idProveedor = _lng_idProveedor;
                mdl_GEN_Direcciones.idEmpleado = _lng_idEmpleado;
                mdl_GEN_Direcciones.idSocio = _lng_idSocio;
                mdl_GEN_Direcciones.idEmpresa = _lng_idEmpresa;
                mdl_GEN_Direcciones.idEmpresaInstaladora = _lng_EmpresaInstaladora;
                mdl_GEN_Direcciones.idOrganismoCertificador = _lng_OrganismoCentificador;
                mdl_GEN_Direcciones.idAgenciaHermes = _lng_idAgenciaHermes;

                mdl_GEN_Direcciones.tipoDireccion = _str_TipoDireccion;
                if (ex_usc_F3_TipoVia.Exferia_F3_Id > -1)
                {
                    mdl_GEN_Direcciones.idTipoVia = ex_usc_F3_TipoVia.Exferia_F3_Id;
                }
                else
                {
                    mdl_GEN_Direcciones.idTipoVia = null;
                }

                mdl_GEN_Direcciones.nombreVia = ex_txt_NombreVia.Text;

                if (ex_cbo_TipoNumeracion.SelectedItem != null)
                {
                    mdl_GEN_Direcciones.tipoNumeracion = ((INTERNO_ComboBox_Modelo)ex_cbo_TipoNumeracion.SelectedItem).Identificador;
                }
                mdl_GEN_Direcciones.calificadorNumero = ex_txt_Calificador.Text;
                mdl_GEN_Direcciones.numeroCasa = ex_txt_NumeroCasa.Text;
                mdl_GEN_Direcciones.bloque = ex_txt_Bloque.Text;
                mdl_GEN_Direcciones.portal = ex_txt_Portal.Text;
                mdl_GEN_Direcciones.escalera = ex_txt_Escalera.Text;
                mdl_GEN_Direcciones.planta = ex_txt_Planta.Text;
                mdl_GEN_Direcciones.puerta = ex_txt_Puerta.Text;
                mdl_GEN_Direcciones.codigoPostal = ex_txt_CodigoPostal.Text;
                mdl_GEN_Direcciones.datosComplementariosDomicilio = ex_txt_DatosComplementarios.Text;

                //F3
                mdl_GEN_Direcciones.idPais = ex_usc_F3_Pais.Exferia_F3_Id;
                mdl_GEN_Direcciones.idProvincia = ex_usc_F3_Provincia.Exferia_F3_Id;

                if (ex_usc_F3_Municipio.Exferia_F3_Id > -1)
                {
                    mdl_GEN_Direcciones.idMunicipio = ex_usc_F3_Municipio.Exferia_F3_Id;
                }
                else
                {
                    mdl_GEN_Direcciones.idMunicipio = null;
                }

                if (ex_usc_F3_Poblacion.Exferia_F3_Id > -1)
                {
                    mdl_GEN_Direcciones.idPoblacion = ex_usc_F3_Poblacion.Exferia_F3_Id;
                }
                else
                {
                    mdl_GEN_Direcciones.idPoblacion = null;
                }
            }
            else
            {
                mdl_GEN_Direcciones.nombreVia = "";

            }

            return mdl_GEN_Direcciones;
        }
        #endregion

        public GEN_Direcciones Obtener_Modelo_A_Copiar()
        {
            GEN_Direcciones mdl_GEN_Direcciones = new GEN_Direcciones();
            mdl_GEN_Direcciones.id = g_mdl_GEN_Direcciones != null ? g_mdl_GEN_Direcciones.id : -1;

            mdl_GEN_Direcciones.GEN_Paises = new GEN_Paises();
            mdl_GEN_Direcciones.GEN_Provincias = new GEN_Provincias();
            mdl_GEN_Direcciones.GEN_Municipios = new GEN_Municipios();
            mdl_GEN_Direcciones.GEN_Poblaciones = new GEN_Poblaciones();

            mdl_GEN_Direcciones.tipoDireccion = "";

            if (ex_usc_F3_TipoVia.Exferia_F3_Id > -1)
            {
                mdl_GEN_Direcciones.idTipoVia = ex_usc_F3_TipoVia.Exferia_F3_Id;
            }
            else
            {
                mdl_GEN_Direcciones.idTipoVia = null;
            }

            mdl_GEN_Direcciones.nombreVia = ex_txt_NombreVia.Text;

            if (ex_cbo_TipoNumeracion.SelectedItem != null)
            {
                mdl_GEN_Direcciones.tipoNumeracion = ((INTERNO_ComboBox_Modelo)ex_cbo_TipoNumeracion.SelectedItem).Identificador;
            }
            mdl_GEN_Direcciones.calificadorNumero = ex_txt_Calificador.Text;
            mdl_GEN_Direcciones.numeroCasa = ex_txt_NumeroCasa.Text;
            mdl_GEN_Direcciones.bloque = ex_txt_Bloque.Text;
            mdl_GEN_Direcciones.portal = ex_txt_Portal.Text;
            mdl_GEN_Direcciones.escalera = ex_txt_Escalera.Text;
            mdl_GEN_Direcciones.planta = ex_txt_Planta.Text;
            mdl_GEN_Direcciones.puerta = ex_txt_Puerta.Text;
            mdl_GEN_Direcciones.codigoPostal = ex_txt_CodigoPostal.Text;
            mdl_GEN_Direcciones.datosComplementariosDomicilio = ex_txt_DatosComplementarios.Text;

            //F3
            mdl_GEN_Direcciones.idPais = ex_usc_F3_Pais.Exferia_F3_Id;
            if (ex_usc_F3_Pais.Exferia_F3_Id > -1)
            {
                mdl_GEN_Direcciones.GEN_Paises.id = ex_usc_F3_Pais.Exferia_F3_Id;
                mdl_GEN_Direcciones.GEN_Paises.codigo_ISO2D = ex_usc_F3_Pais.Exferia_F3_Codigo;
                mdl_GEN_Direcciones.GEN_Paises.descripcion = ex_usc_F3_Pais.Exferia_F3_Descripcion;
                mdl_GEN_Direcciones.GEN_Paises.fechaBorrado = ex_usc_F3_Pais.Exferia_F3_FechaBorrado;
            }
            else
            {
                mdl_GEN_Direcciones.GEN_Paises.id = -1;
                mdl_GEN_Direcciones.GEN_Paises.codigo_ISO2D = string.Empty;
                mdl_GEN_Direcciones.GEN_Paises.descripcion = string.Empty;
                mdl_GEN_Direcciones.GEN_Paises.fechaBorrado = null;
            }

            //F3_Provincia
            mdl_GEN_Direcciones.idProvincia = ex_usc_F3_Provincia.Exferia_F3_Id;

            if (ex_usc_F3_Provincia.Exferia_F3_Id > -1)
            {
                mdl_GEN_Direcciones.GEN_Provincias.id = ex_usc_F3_Provincia.Exferia_F3_Id;
                mdl_GEN_Direcciones.GEN_Provincias.codigo = ex_usc_F3_Provincia.Exferia_F3_Codigo;
                mdl_GEN_Direcciones.GEN_Provincias.descripcion = ex_usc_F3_Provincia.Exferia_F3_Descripcion;
                mdl_GEN_Direcciones.GEN_Provincias.fechaBorrado = ex_usc_F3_Provincia.Exferia_F3_FechaBorrado;
            }
            else
            {
                mdl_GEN_Direcciones.GEN_Provincias.id = -1;
                mdl_GEN_Direcciones.GEN_Provincias.codigo = string.Empty;
                mdl_GEN_Direcciones.GEN_Provincias.descripcion = string.Empty;
                mdl_GEN_Direcciones.GEN_Provincias.fechaBorrado = null;
            }

            if (ex_usc_F3_Municipio.Exferia_F3_Id > -1)
            {
                mdl_GEN_Direcciones.idMunicipio = ex_usc_F3_Municipio.Exferia_F3_Id;

                mdl_GEN_Direcciones.GEN_Municipios.id = ex_usc_F3_Municipio.Exferia_F3_Id;
                mdl_GEN_Direcciones.GEN_Municipios.codigoINE = ex_usc_F3_Municipio.Exferia_F3_Codigo;
                mdl_GEN_Direcciones.GEN_Municipios.descripcion = ex_usc_F3_Municipio.Exferia_F3_Descripcion;
                mdl_GEN_Direcciones.GEN_Municipios.fechaBorrado = ex_usc_F3_Municipio.Exferia_F3_FechaBorrado;
            }
            else
            {
                mdl_GEN_Direcciones.idMunicipio = null;

                mdl_GEN_Direcciones.GEN_Municipios.id = -1;
                mdl_GEN_Direcciones.GEN_Municipios.codigoINE = string.Empty;
                mdl_GEN_Direcciones.GEN_Municipios.descripcion = string.Empty;
                mdl_GEN_Direcciones.GEN_Municipios.fechaBorrado = null;
            }

            if (ex_usc_F3_Poblacion.Exferia_F3_Id > -1)
            {
                mdl_GEN_Direcciones.idPoblacion = ex_usc_F3_Poblacion.Exferia_F3_Id;

                mdl_GEN_Direcciones.GEN_Poblaciones.id = ex_usc_F3_Poblacion.Exferia_F3_Id;
                mdl_GEN_Direcciones.GEN_Poblaciones.codigo = ex_usc_F3_Poblacion.Exferia_F3_Codigo;
                mdl_GEN_Direcciones.GEN_Poblaciones.descripcion = ex_usc_F3_Poblacion.Exferia_F3_Descripcion;
                mdl_GEN_Direcciones.GEN_Poblaciones.fechaBorrado = ex_usc_F3_Poblacion.Exferia_F3_FechaBorrado;
            }
            else
            {
                mdl_GEN_Direcciones.idPoblacion = null;

                mdl_GEN_Direcciones.GEN_Poblaciones.id = -1;
                mdl_GEN_Direcciones.GEN_Poblaciones.codigo = string.Empty;
                mdl_GEN_Direcciones.GEN_Poblaciones.descripcion = string.Empty;
                mdl_GEN_Direcciones.GEN_Poblaciones.fechaBorrado = null;
            }

            return mdl_GEN_Direcciones;
        }

        #region F3
        private void ex_usc_F3_Pais_Exferia_F3_Evento_TerminoBusqueda(object sender, EventArgs e)
        {
            //Para que salte el evento en el otro lado
            Exferia_DireccionFiscal_Pais_Actualizado?.Invoke(sender, new INTERNO_EventArgs_String(ex_usc_F3_Pais.Exferia_F3_Codigo));

            Actualizar_Provincia(true);
        }
        private void ex_usc_F3_Provincia_Exferia_F3_Evento_TerminoBusqueda(object sender, EventArgs e)
        {
            Actualizar_Municipio(true);
        }
        private void ex_usc_F3_Municipio_Exferia_F3_Evento_TerminoBusqueda(object sender, EventArgs e)
        {
            Actualizar_Poblacion(true);
        }
        public void Actualizar_Provincia(bool _bol_Vaciar)
        {
            //Vaciar el Provincia
            if (_bol_Vaciar)
            {
                ex_usc_F3_Provincia.Exferia_F3_Id = -1;
                ex_usc_F3_Provincia.Exferia_F3_Codigo = "";
                ex_usc_F3_Provincia.Exferia_F3_Descripcion = "";
                ex_usc_F3_Provincia.Exferia_F3_FechaBorrado = null;
            }

            if (ex_usc_F3_Pais.Exferia_F3_Id > 0)
            {
                ex_usc_F3_Provincia.Enabled = true;

                //Poner Filtro
                ex_usc_F3_Provincia.Exferia_F3_RELACIONADOS_Padre_OPCION = Variables.G_STR_OPCION_GEN_PAIS;
                ex_usc_F3_Provincia.Exferia_F3_RELACIONADOS_Padre_ID = ex_usc_F3_Pais.Exferia_F3_Id;
            }
            else
            {
                ex_usc_F3_Provincia.Enabled = false;
            }

            Actualizar_Municipio(_bol_Vaciar);
        }
        public void Actualizar_Municipio(bool _bol_Vaciar)
        {
            //Vaciar el Municipio
            if (_bol_Vaciar)
            {
                ex_usc_F3_Municipio.Exferia_F3_Id = -1;
                ex_usc_F3_Municipio.Exferia_F3_Codigo = "";
                ex_usc_F3_Municipio.Exferia_F3_Descripcion = "";
                ex_usc_F3_Municipio.Exferia_F3_FechaBorrado = null;
            }

            if (ex_usc_F3_Provincia.Exferia_F3_Id > 0)
            {
                ex_usc_F3_Municipio.Enabled = true;

                //Poner Filtro
                ex_usc_F3_Municipio.Exferia_F3_RELACIONADOS_Padre_OPCION = Variables.G_STR_OPCION_GEN_PROVINCIA;
                ex_usc_F3_Municipio.Exferia_F3_RELACIONADOS_Padre_ID = ex_usc_F3_Provincia.Exferia_F3_Id;
            }
            else
            {
                ex_usc_F3_Municipio.Enabled = false;
            }

            Actualizar_Poblacion(_bol_Vaciar);
        }
        public void Actualizar_Poblacion(bool _bol_Vaciar)
        {
            //Vaciar el Municipio
            if (_bol_Vaciar)
            {
                ex_usc_F3_Poblacion.Exferia_F3_Id = -1;
                ex_usc_F3_Poblacion.Exferia_F3_Codigo = "";
                ex_usc_F3_Poblacion.Exferia_F3_Descripcion = "";
                ex_usc_F3_Poblacion.Exferia_F3_FechaBorrado = null;
            }

            if (ex_usc_F3_Municipio.Exferia_F3_Id > 0)
            {
                ex_usc_F3_Poblacion.Enabled = true;

                //Poner Filtro
                ex_usc_F3_Poblacion.Exferia_F3_RELACIONADOS_Padre_OPCION = Variables.G_STR_OPCION_GEN_MUNICIPIO;
                ex_usc_F3_Poblacion.Exferia_F3_RELACIONADOS_Padre_ID = ex_usc_F3_Municipio.Exferia_F3_Id;
            }
            else
            {
                ex_usc_F3_Poblacion.Enabled = false;
            }
        }

        #endregion

        #region Eventos
        private void ex_btn_Copiar_click(object sender, EventArgs e)
        {
            //Para que salte el evento en el otro lado
            EventHandler<INTERNO_EventArgs> temp = boton_Copiar_Click;
            if (temp != null)
                temp(sender, new INTERNO_EventArgs(g_int_TipoDireccion));
        }
        #endregion

        #region Copiar
        public void Copiar(GEN_Direcciones _mdl_GEN_Direcciones)
        {
            //Antes de hacer nada vuelvo a asignarle su id
            GEN_Direcciones mdl_GEN_Direcciones = new GEN_Direcciones();
            mdl_GEN_Direcciones.id = g_mdl_GEN_Direcciones != null ? g_mdl_GEN_Direcciones.id : -1;

            _mdl_GEN_Direcciones.id = mdl_GEN_Direcciones.id;

            //Luego vaciamos
            VaciarDatos();

            //Despues Cargamos
            CargarDatos(_mdl_GEN_Direcciones);
        }
        #endregion
    }
}
