using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GMLL00ImportadorXsd.Utilidades.Localizacion;
using System.Globalization;
using System.Threading;
using System.IO;
using System.Configuration;

using GMLL00ImportadorXsd.Logica;
using GMLL00ImportadorXsd.Negocio;
using GMLL00ImportadorXsd.Utilidades.Log;
using GMLL00ImportadorXsd.Presentacion.Utilidades2;

namespace GMLL00ImportadorXsd.Presentacion
{


    public partial class GenerarFicherosForm : Form
    {
        #region Variables

        private string nombreCultura = string.Empty;
        private ObtenerDatos ObjObtenDatos = new ObtenerDatos();
        private string nombreFicheroSalida = string.Empty;
        private EsperaForm ObjEspera;
        private string imagenMostrar = string.Empty;

        #endregion

        #region Constructores
        public GenerarFicherosForm()
        {
            nombreFicheroSalida = Convert.ToString(ConfigurationManager.AppSettings["NombreFicheroSql"], null);
            InitializeComponent();
        }

        #endregion


        #region Eventos

        private void GenerarFicherosForm_Load(object sender, EventArgs e)
        {
            nombreCultura = Thread.CurrentThread.CurrentCulture.Name;

            if ((!nombreCultura.Equals("es-ES")) || (!nombreCultura.Equals("eu-ES")))
            {
                nombreCultura = "es-ES";
            }

            if (nombreCultura.Equals("eu-ES"))
            {
                this.rbtEu.Checked = true;
            }

            this.ActualizarIdiomaInterfaz();
            this.ObtenerParametros();
        }

        private void rbtEs_CheckedChanged(object sender, EventArgs e)
        {
            this.EventoCultura();
        }


        private void rbtEu_CheckedChanged(object sender, EventArgs e)
        {
            this.EventoCultura();
        }

        private void ubtSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void ubtBuscaXSD_Click(object sender, EventArgs e)
        {
            OpenFileDialog File1 = new OpenFileDialog();


            File1.DefaultExt = "xsd";
            File1.Filter = "XSD file (*.xsd)|*.xsd";
            if (File1.ShowDialog() == DialogResult.OK)
            {

                this.txtFicheroXsd.Text = File1.FileName;
            }
        }

        private void ubtBuscaEstilos_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dialogoRuta = new FolderBrowserDialog();
            if (dialogoRuta.ShowDialog() == DialogResult.OK)
            {
                this.txtFicherosEstilos.Text = dialogoRuta.SelectedPath;
            }
        }

        private void ubtBuscaRutaSQL_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dialogoRuta = new FolderBrowserDialog();
            if (dialogoRuta.ShowDialog() == DialogResult.OK)
            {
                this.txtFicheroSQLSalida.Text = dialogoRuta.SelectedPath;
            }
        }

        private void ubtAceptarCrearSQL_Click(object sender, EventArgs e)
        {
            if (validarFormularioGeneraSQL())
            {
                this.abrirVentanaEspera();
            }
        }



        private void ubtBuscaSQLEntrada_Click(object sender, EventArgs e)
        {
            OpenFileDialog File1 = new OpenFileDialog();


            File1.DefaultExt = "sql";
            File1.Filter = "SQL file (*.sql)|*.sql";
            if (File1.ShowDialog() == DialogResult.OK)
            {
                this.txtFicheroSQLEntrada.Text = File1.FileName;
            }
        }


        private void ubtAceptarBBDD_Click(object sender, EventArgs e)
        {
            this.validacionConexionBBDD();

        }




        private void ultraTabControl1_SelectedTabChanged(object sender, Infragistics.Win.UltraWinTabControl.SelectedTabChangedEventArgs e)
        {
            if (!(string.IsNullOrEmpty(this.txtFicheroSQLSalida.Text)))
            {
                this.txtFicheroSQLEntrada.Text = this.txtFicheroSQLSalida.Text + "\\" + nombreFicheroSalida; 
            }
            else
            {
                this.txtFicheroSQLEntrada.Text = "";
            }
        }

        private void ubtAceptarLanzarSQL_Click(object sender, EventArgs e)
        {
            bool salida = false;
            string texto = string.Empty;
            string rutaFicheroLog = string.Empty;
            string ficheroLogSalida = string.Empty;
            ConexionBbdd ObjConexLogica = DatosConexion();
            string cadenaConexion = string.Empty;


            if (validarEjecutaSQL())
            {
                salida = ObjConexLogica.ProbandoConexion();
                if (!salida)
                {
                    if (nombreCultura.Equals("es-ES"))
                    {
                        texto = Properties.Resources.validaConexionErrorES;
                    }
                    else
                    {
                        texto = Properties.Resources.validaConexionErrorEU;
                    }
                    this.mensaje(texto, ModoMensaje.Error);
                }
                else if (salida)
                {

                    Thread lengthyProcessThread = new Thread(new ThreadStart(ejecutarLanzaSQL));
                    lengthyProcessThread.IsBackground = true;
                    lengthyProcessThread.Start();
                    ObjEspera = new EsperaForm();
                    ObjEspera.ShowDialog();
                }
            }

       
        }
        #endregion


        #region Metodos
        private void ObtenerParametros()
        {
            this.txtServidor.Text = ObjObtenDatos.Servidor;
            this.txtPuerto.Text = ObjObtenDatos.Puerto;
            this.txtNombreBBDD.Text = ObjObtenDatos.Database;
            this.txtUsuario.Text = ObjObtenDatos.Usuario;
            this.txtPassword.Text = ObjObtenDatos.Password;
            this.imagenMostrar = ObjObtenDatos.ImagenPlan;
        }


        /// <summary>
        /// Método de configuración de Apariencia de la pantalla.
        /// </summary>       
        public void ActualizarIdiomaInterfaz()
        {

            if (nombreCultura.Equals("es-ES"))
            {
                this.toolTip1.SetToolTip(this.ubtAceptarCrearSQL, Properties.Resources.ubtAceptar_ToolTipTextES);
                this.toolTip1.SetToolTip(this.ubtAceptarBBDD, Properties.Resources.ubtAceptar_ToolTipTextES);
                this.toolTip1.SetToolTip(this.ubtAceptarLanzarSQL, Properties.Resources.ubtAceptar_ToolTipTextES);
                this.toolTip1.SetToolTip(this.ubtSalir, Properties.Resources.ubtSalir_ToolTipTextES);
                this.toolTip1.SetToolTip(this.ubtBuscaXSD, Properties.Resources.ubtBusca_ToolTipTextES);
                this.toolTip1.SetToolTip(this.ubtBuscaEstilos, Properties.Resources.ubtBusca_ToolTipTextES);
                this.toolTip1.SetToolTip(this.ubtBuscaRutaSQL, Properties.Resources.ubtBusca_ToolTipTextES);
                this.toolTip1.SetToolTip(this.ubtBuscaSQLEntrada, Properties.Resources.ubtBusca_ToolTipTextES);

                this.Text = Properties.Resources.Text_FormES;
                this.ubtTituloVentana.Text = Properties.Resources.ubtTituloVentanaES;
                this.lblIdioma.Text = Properties.Resources.lblIdiomaES;
                this.ultraTabControl1.Tabs[0].Text = Properties.Resources.ultraTabControl1_GeneraFicheroES;
                this.ultraTabControl1.Tabs[1].Text = Properties.Resources.ultraTabControl1_LanzaFicheroES;
                this.ubtInfoEntrada.Text = Properties.Resources.ubtInfoEntrada_TextES;
                this.lblIntroFichXSD.Text = Properties.Resources.lblIntroFichXSDES;
                this.lblIntroFichEstilo.Text = Properties.Resources.lblIntroFichEstiloES;
                this.ubtInfoSalida.Text = Properties.Resources.ubtInfoSalida_TextES;
                this.lblRutaSQLSalida.Text = Properties.Resources.lblRutaSQLSalidaES;
                this.ubtAccesoBBDD.Text = Properties.Resources.ubtAccesoBBDD_TextES;
                this.lblServidor.Text = Properties.Resources.lblServidor;
                this.lblPuerto.Text = Properties.Resources.lblPuertoES;
                this.lblNombreBBDD.Text = Properties.Resources.lblNombreBBDDES;
                this.lblUsuario.Text = Properties.Resources.lblUsuarioES;
                this.lblPassword.Text = Properties.Resources.lblPasswordES;
                this.ubtEjecuarSQL.Text = Properties.Resources.ubtEjecuarSQL_TextES;
                this.lblRutaSQLEntrada.Text = Properties.Resources.lblRutaSQLEntrada;
                this.ubtAcercaDe.Text = Properties.Resources.AcercadeES;
            }
            else
            {
                this.toolTip1.SetToolTip(this.ubtAceptarCrearSQL, Properties.Resources.ubtAceptar_ToolTipTextEU);
                this.toolTip1.SetToolTip(this.ubtAceptarBBDD, Properties.Resources.ubtAceptar_ToolTipTextEU);
                this.toolTip1.SetToolTip(this.ubtAceptarLanzarSQL, Properties.Resources.ubtAceptar_ToolTipTextEU);
                this.toolTip1.SetToolTip(this.ubtSalir, Properties.Resources.ubtSalir_ToolTipTextEU);
                this.toolTip1.SetToolTip(this.ubtBuscaXSD, Properties.Resources.ubtBusca_ToolTipTextEU);
                this.toolTip1.SetToolTip(this.ubtBuscaEstilos, Properties.Resources.ubtBusca_ToolTipTextEU);
                this.toolTip1.SetToolTip(this.ubtBuscaRutaSQL, Properties.Resources.ubtBusca_ToolTipTextEU);
                this.toolTip1.SetToolTip(this.ubtBuscaSQLEntrada, Properties.Resources.ubtBusca_ToolTipTextEU);

                this.Text = Properties.Resources.Text_FormEU;
                this.ubtTituloVentana.Text = Properties.Resources.ubtTituloVentanaEU;
                this.lblIdioma.Text = Properties.Resources.lblIdiomaEU;
                this.ultraTabControl1.Tabs[0].Text = Properties.Resources.ultraTabControl1_GeneraFicheroEU;
                this.ultraTabControl1.Tabs[1].Text = Properties.Resources.ultraTabControl1_LanzaFicheroEU;
                this.ubtInfoEntrada.Text = Properties.Resources.ubtInfoEntrada_TextEU;
                this.lblIntroFichXSD.Text = Properties.Resources.lblIntroFichXSDEU;
                this.lblIntroFichEstilo.Text = Properties.Resources.lblIntroFichEstiloEU;
                this.ubtInfoSalida.Text = Properties.Resources.ubtInfoSalida_TextEU;
                this.lblRutaSQLSalida.Text = Properties.Resources.lblRutaSQLSalidaEU;
                this.ubtAccesoBBDD.Text = Properties.Resources.ubtAccesoBBDD_TextEU;
                this.lblServidor.Text = Properties.Resources.lblServidorEU;
                this.lblPuerto.Text = Properties.Resources.lblPuertoEU;
                this.lblNombreBBDD.Text = Properties.Resources.lblNombreBBDDEU;
                this.lblUsuario.Text = Properties.Resources.lblUsuarioEU;
                this.lblPassword.Text = Properties.Resources.lblPasswordEU;
                this.ubtEjecuarSQL.Text = Properties.Resources.ubtEjecuarSQL_TextEU;
                this.lblRutaSQLEntrada.Text = Properties.Resources.lblRutaSQLEntradaEU;
                this.ubtAcercaDe.Text = Properties.Resources.AcercadeEU;
            }
        }





        private void EventoCultura()
        {
            if (this.rbtEs.Checked)
            {
                nombreCultura = "es-ES";
            }
            else if (this.rbtEu.Checked)
            {
                nombreCultura = "eu-ES";
            }
            this.ActualizarIdiomaInterfaz();
        }

        private void abrirVentanaEspera()
        {
            Thread lengthyProcessThread = new Thread(new ThreadStart(crearSQLdesdeXSD));
            lengthyProcessThread.IsBackground = true;
            lengthyProcessThread.Start();
            ObjEspera = new EsperaForm();
            ObjEspera.ShowDialog();

        }

        private void crearSQLdesdeXSD()
        {

            string texto = string.Empty;
            //Comprobamos si existe fichero, si existe lo borramos 
            string ficheroSQLSalida = string.Empty;
            string resultSalida = string.Empty;
            
            ficheroSQLSalida = this.txtFicheroSQLSalida.Text + "\\" + nombreFicheroSalida;          
            if (File.Exists(ficheroSQLSalida.Trim()))
            {
                File.Delete(ficheroSQLSalida);
            }

            if (validarFormularioGeneraSQL())
            {
                //Si estan todos los campos validados, pasamos el fichero XSD a la Logica de negocio
                FicheroXsd ObjFicheroXSD = new FicheroXsd(this.txtFicheroXsd.Text, this.txtFicherosEstilos.Text, this.txtFicheroSQLSalida.Text);
                resultSalida = ObjFicheroXSD.ObtenerDatosEntrada();
                ObjEspera.ShouldCloseNow = true;

                if (string.IsNullOrEmpty(resultSalida))
                {
                    if (nombreCultura.Equals("es-ES"))
                    {
                        texto = Properties.Resources.procesoXsdCompletadoES;
                    }
                    else
                    {
                        texto = Properties.Resources.procesoXsdCompletadoEU;
                    }
                    mensaje(texto, ModoMensaje.Warning);
                }
                else
                {
                    texto = resultSalida;
                    mensaje(texto, ModoMensaje.Error);
                }


            }
        }
        private bool validarFormularioGeneraSQL()
        {
            bool validacion = true;
            string texto = string.Empty;

            //Validación ruta fichero XSD
            if (validacion)
            {
                bool existeXSD = File.Exists(this.txtFicheroXsd.Text.Trim());
                if ((string.IsNullOrEmpty(this.txtFicheroXsd.Text.Trim())) || (!existeXSD))
                {
                    if (nombreCultura.Equals("es-ES"))
                    {
                        texto = Properties.Resources.validarFicheroXsdES;
                    }
                    else
                    {
                        texto = Properties.Resources.validarFicheroXsdEU;
                    }
                    validacion = mensaje(texto, ModoMensaje.Error);
                }
            }
            if (validacion)
            {
                bool existeEstilos = Directory.Exists(this.txtFicherosEstilos.Text.Trim());
                if ((string.IsNullOrEmpty(this.txtFicherosEstilos.Text.Trim())) || (!existeEstilos))
                {
                    if (nombreCultura.Equals("es-ES"))
                    {
                        texto = Properties.Resources.validarFicheroEstilosES;
                    }
                    else
                    {
                        texto = Properties.Resources.validarFicheroEstilosEU;
                    }
                    validacion = mensaje(texto, ModoMensaje.Error);
                }
            }
            if (validacion)
            {
                bool existeRutaSQLSalida = Directory.Exists(this.txtFicheroSQLSalida.Text.Trim());
                if ((string.IsNullOrEmpty(this.txtFicheroSQLSalida.Text.Trim())) || (!existeRutaSQLSalida))
                {
                    if (nombreCultura.Equals("es-ES"))
                    {
                        texto = Properties.Resources.validarRutaSQLSalidaES;
                    }
                    else
                    {
                        texto = Properties.Resources.validarRutaSQLSalidaEU;
                    }
                    validacion = mensaje(texto, ModoMensaje.Error);
                }
            }

            return validacion;
        }

        private bool validarEjecutaSQL()
        {
            bool validacion = true;
            string texto = string.Empty;

            //Validación ruta fichero sql
            if (validacion)
            {
                bool existeSQL = File.Exists(this.txtFicheroSQLEntrada.Text.Trim());
                if ((string.IsNullOrEmpty(this.txtFicheroSQLEntrada.Text.Trim())) || (!existeSQL))
                {
                    if (nombreCultura.Equals("es-ES"))
                    {
                        texto = Properties.Resources.validarRutaSQLSalidaES;
                    }
                    else
                    {
                        texto = Properties.Resources.validarRutaSQLSalidaEU;
                    }
                    validacion = mensaje(texto, ModoMensaje.Error);
                }
            }

            return validacion;
        }


        private bool mensaje(string Texto, ModoMensaje modoMensaje)
        {
            bool validacion = true;
            //  MensajeForm objMensaje = new MensajeForm(Texto, ModoMensaje.Warning);
            MensajeForm objMensaje = new MensajeForm(Texto, modoMensaje);
            objMensaje.ShowDialog();
            validacion = false;
            return validacion;
        }




        private ConexionBbdd DatosConexion()
        {
            DatosConexionBbdd ObjConexion = new DatosConexionBbdd();
            ObjConexion.Servidor = this.txtServidor.Text;
            ObjConexion.Puerto = this.txtPuerto.Text;
            ObjConexion.NombreBbdd = this.txtNombreBBDD.Text;
            ObjConexion.Usuario = this.txtUsuario.Text;
            ObjConexion.Password = this.txtPassword.Text;

            ConexionBbdd ObjConexLogica = new ConexionBbdd(ObjConexion);

            return ObjConexLogica;
        }

        private bool validacionConexionBBDD()
        {

            ConexionBbdd ObjConexLogica = DatosConexion();
            bool salida =true;
            string texto = string.Empty;

            if ((string.IsNullOrEmpty(this.txtServidor.Text)) || (string.IsNullOrEmpty(this.txtPuerto.Text)) || 
                (string.IsNullOrEmpty(this.txtNombreBBDD.Text)) || (string.IsNullOrEmpty(this.txtUsuario.Text)) || (string.IsNullOrEmpty(this.txtPassword.Text))) {
                  
                    salida = false;
            }
                salida = ObjConexLogica.ProbandoConexion();
           
            if (!salida)
            {
                if (nombreCultura.Equals("es-ES"))
                {
                    texto = Properties.Resources.validaConexionErrorES;
                }
                else
                {
                    texto = Properties.Resources.validaConexionErrorEU;
                }
            }
            else
            {
                if (nombreCultura.Equals("es-ES"))
                {
                    texto = Properties.Resources.validaConexionES;

                    ObjObtenDatos.Servidor = this.txtServidor.Text;
                    ObjObtenDatos.Puerto = this.txtPuerto.Text;
                    ObjObtenDatos.Database = this.txtNombreBBDD.Text;
                    ObjObtenDatos.Usuario = this.txtUsuario.Text;
                    ObjObtenDatos.Password = this.txtPassword.Text;

                    ObjObtenDatos.GuardaParametros();
                }
                else
                {
                    texto = Properties.Resources.validaConexionEU;
                    ObjObtenDatos.GuardaParametros();
                }
            }
            mensaje(texto, ModoMensaje.Warning);
            return salida;
        }


        private void ejecutarLanzaSQL()
        {


            string texto = string.Empty;
            string rutaFicheroLog = string.Empty;
            string ficheroLogSalida = string.Empty;
            ConexionBbdd ObjConexLogica = DatosConexion();
            string cadenaConexion = string.Empty;

            cadenaConexion = ObjConexLogica.ObtenerCadenaConexion();
            //Si existe el fichero log lo borramos.                                 
            rutaFicheroLog = this.txtFicheroSQLEntrada.Text.Substring(0, this.txtFicheroSQLEntrada.Text.LastIndexOf("\\", StringComparison.OrdinalIgnoreCase));
            ficheroLogSalida = rutaFicheroLog + "\\" + ConfigurationManager.AppSettings ["NombreFicheroLog"];// "FicheroLog.log";

            if (File.Exists(ficheroLogSalida.Trim()))
            {
                File.Delete(ficheroLogSalida);
            }

            FicheroSql ObjFicheroSQL = new FicheroSql();
            ObjFicheroSQL.LeerFichero(this.txtFicheroSQLEntrada.Text, rutaFicheroLog, cadenaConexion);

            ObjEspera.ShouldCloseNow = true;
            //Si no existe el fichero  log ponemos ejecutado satisfactoriametne
            if (!File.Exists(ficheroLogSalida.Trim()))
            {
                if (nombreCultura.Equals("es-ES"))
                {
                    texto = Properties.Resources.validarLanzaSQLES;
                }
                else
                {
                    texto = Properties.Resources.validarLanzaSQLEU;
                }
                this.mensaje(texto, ModoMensaje.Confirm);
            }
            else
            { //si existe el fichero deberia poner "Proceso ejecutado. Consulte el fichero 'FicheroLog.log'
                if (nombreCultura.Equals("es-ES"))
                {
                    texto = Properties.Resources.validaLanzaSQLErrorES;
                }
                else
                {
                    texto = Properties.Resources.validaLanzaSQLErrorEU;
                }
                this.mensaje(texto, ModoMensaje.Error);

            }
        }


        #endregion

        private void ubtAcercaDe_Click(object sender, EventArgs e)
        {
            Bitmap MyImage;
            string fileToDisplay = this.imagenMostrar;

            MyImage = new Bitmap(fileToDisplay);
            
            FrmFotoAmpliada acercade = new FrmFotoAmpliada(fileToDisplay);
            acercade.Text = this.ubtAcercaDe.Text ;
            acercade.Width = MyImage.Size.Width +100;
            acercade.Height = MyImage.Size.Height + 100; 
            acercade.ShowDialog();            
        }

       

         
    }
}
