using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace GMLC01HerramientasCad.Logica
{
    /// <summary>
    /// Formulario de generación de temáticos
    /// </summary>
    public partial class TematicosForm : BaseForm
    {
        private ITematicos iCommIF;
        TematicoDatosInput iDatosInput;

        /// <summary>
        /// Constructor del formulario
        /// </summary>
        /// <param name="commIF">Interfaz implementada con las funciones a llamar desde el formulario</param>
        public TematicosForm(ITematicos commIF, TematicoDatosInput datosInput)
        {
            try
            {
                iCommIF = commIF;
                iDatosInput = datosInput;

                InitializeComponent();

                this.cBoxCampo1.DisplayMember = "Nombre";
                this.cBoxCampo2.DisplayMember = "Nombre";

                foreach (Atributo attr in iDatosInput.Entidad.Atributos)
                    if (//(attr.TipoEdicion == TiposEdicion.Combo || attr.TipoEdicion == TiposEdicion.Texto) &&
                        attr.Codigo != ModComun.XSD.Clave)
                        cBoxCampo1.Items.Add(attr);

                if (cBoxCampo1.Items.Count == 0)
                {
                    tabCuantitativo.Select();
                    tabTematicos.TabPages.Remove(tabCualitativo);
                }
                else
                {
                    cBoxCampo1.SelectedIndex = 0;
                }

                this.cBoxAtributo.DisplayMember = "Nombre";
                foreach (Atributo attr in iDatosInput.Entidad.Atributos)
                    if ((attr.TipoEdicion == TiposEdicion.Doble || attr.TipoEdicion == TiposEdicion.Entero) && attr.Codigo != ModComun.XSD.Clave)
                        cBoxAtributo.Items.Add(attr);

                cBoxAtributo.SelectedIndex = 0;            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }

        }

        private Boolean ValidarRangos()
        {
            try
            {
                if (dgViewRangos.Rows.Count <= 1)
                    return false;

                for (int i = 0; i < dgViewRangos.Rows.Count - 1; i++)
                    if (double.Parse(dgViewRangos.Rows[i].Cells["minRango"].Value.ToString().Replace(",","."), CultureInfo.InvariantCulture) >=
                        double.Parse(dgViewRangos.Rows[i].Cells["maxRango"].Value.ToString().Replace(",", "."), CultureInfo.InvariantCulture))
                        return false;

                for (int i = 0; i < dgViewRangos.Rows.Count - 2; i++)
                    if (double.Parse(dgViewRangos.Rows[i].Cells["maxRango"].Value.ToString().Replace(",", "."), CultureInfo.InvariantCulture) >
                        double.Parse(dgViewRangos.Rows[i + 1].Cells["minRango"].Value.ToString().Replace(",", "."), CultureInfo.InvariantCulture))
                        return false;

                return true;
            }
            catch (System.ArgumentNullException)
            {
                return false;
            }
            catch (System.FormatException)
            {
                return false;
            }
            catch (System.OverflowException)
            {
                return false;
            }
        }

        private void ButtonAceptarClick(object sender, EventArgs e)
        {
            CriterioTematicos criterio = new CriterioTematicos();
            criterio.Entidad = iDatosInput.Entidad;
            if (tabTematicos.SelectedTab.Equals(tabCualitativo))
            {
                criterio.Tipo = TipoTematico.Cuantitativo;
                criterio.Atributo1 = (Atributo)cBoxCampo1.SelectedItem;
                criterio.Atributo2 = cBoxCampo2.SelectedItem != null ? (Atributo)(cBoxCampo2.SelectedItem) : null;
                iCommIF.TematicoDiscreto(criterio);
            }
            else
            {
                if (!ValidarRangos())
                {
                    MessageBox.Show(Properties.Resources.EspecificacionDeRangosIncorrecta, "GMLC", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, 0);
                    return;
                }

                criterio.Tipo = TipoTematico.Cualitativo;
                criterio.Atributo1 = (Atributo)cBoxAtributo.SelectedItem;
                criterio.Rangos = new Collection<RangoTematico>();
                for (int i = 0; i < dgViewRangos.Rows.Count - 1; i++)
                {
                    criterio.Rangos.Add(new RangoTematico(double.Parse(dgViewRangos.Rows[i].Cells["minRango"].Value.ToString().Replace(",", "."), CultureInfo.InvariantCulture),
                                                          double.Parse(dgViewRangos.Rows[i].Cells["maxRango"].Value.ToString().Replace(",", "."), CultureInfo.InvariantCulture)));
                }
                iCommIF.TematicoContinuo(criterio);
            }

            this.Close();
        }

        private void GenerarCombinaciones()
        {
            Atributo campo1 = (Atributo)cBoxCampo1.SelectedItem;
            Atributo campo2 = (cBoxCampo2.SelectedItem == null || cBoxCampo2.SelectedItem.ToString().Length == 0) ? null : (Atributo)cBoxCampo2.SelectedItem;

            dGridCombinaciones.Rows.Clear();
            dGridCombinaciones.Columns[0].HeaderText = campo1 != null ? campo1.Nombre : "";
            dGridCombinaciones.Columns[1].HeaderText = campo2 != null ? campo2.Nombre : "";

            if (campo1.TipoEdicion == TiposEdicion.Combo)
                if (campo2 != null)
                    if (campo2.TipoEdicion == TiposEdicion.Combo)
                        foreach (ValorDominio valor1 in ModComun.XSD.Dominios[campo1.NombreDominio].Valores)
                            foreach (ValorDominio valor2 in ModComun.XSD.Dominios[campo2.NombreDominio].Valores)
                                dGridCombinaciones.Rows.Add(valor1.Texto, valor2.Texto);
                    else if (campo2.TipoEdicion == TiposEdicion.Texto)
                        foreach (ValorDominio valor1 in ModComun.XSD.Dominios[campo1.NombreDominio].Valores)
                            foreach (String valor2 in iDatosInput.AtributosTexto[campo2.Codigo].Valores)
                                dGridCombinaciones.Rows.Add(valor1.Texto, valor2);
                    else //Numérico
                        foreach (ValorDominio valor1 in ModComun.XSD.Dominios[campo1.NombreDominio].Valores)
                            foreach (double valor2 in iDatosInput.AtributosNumericos[campo2.Codigo].Valores)
                                dGridCombinaciones.Rows.Add(valor1.Texto, valor2.ToString(CultureInfo.InvariantCulture));
                else
                    foreach (ValorDominio valor1 in ModComun.XSD.Dominios[campo1.NombreDominio].Valores)
                        dGridCombinaciones.Rows.Add(valor1.Texto, "");
            else if (campo1.TipoEdicion == TiposEdicion.Texto)
                if (campo2 != null)
                    if (campo2.TipoEdicion == TiposEdicion.Combo)
                        foreach (String valor1 in iDatosInput.AtributosTexto[campo1.Codigo].Valores)
                            foreach (ValorDominio valor2 in ModComun.XSD.Dominios[campo2.NombreDominio].Valores)
                                dGridCombinaciones.Rows.Add(valor1, valor2.Texto);
                    else if (campo2.TipoEdicion == TiposEdicion.Texto)
                        foreach (String valor1 in iDatosInput.AtributosTexto[campo1.Codigo].Valores)
                            foreach (String valor2 in iDatosInput.AtributosTexto[campo2.Codigo].Valores)
                                dGridCombinaciones.Rows.Add(valor1, valor2);
                    else // Numérico
                        foreach (String valor1 in iDatosInput.AtributosTexto[campo1.Codigo].Valores)
                            foreach (double valor2 in iDatosInput.AtributosNumericos[campo2.Codigo].Valores)
                                dGridCombinaciones.Rows.Add(valor1, valor2.ToString(CultureInfo.InvariantCulture));
                else
                    foreach (String valor1 in iDatosInput.AtributosTexto[campo1.Codigo].Valores)
                        dGridCombinaciones.Rows.Add(valor1, "");
            else // Numérico                
                if (campo2 != null)
                    if (campo2.TipoEdicion == TiposEdicion.Combo)
                        foreach (double valor1 in iDatosInput.AtributosNumericos[campo1.Codigo].Valores)
                            foreach (ValorDominio valor2 in ModComun.XSD.Dominios[campo2.NombreDominio].Valores)
                                dGridCombinaciones.Rows.Add(valor1.ToString(CultureInfo.InvariantCulture), valor2.Texto);
                    else if (campo2.TipoEdicion == TiposEdicion.Texto)
                        foreach (double valor1 in iDatosInput.AtributosNumericos[campo1.Codigo].Valores)
                            foreach (String valor2 in iDatosInput.AtributosTexto[campo2.Codigo].Valores)
                                dGridCombinaciones.Rows.Add(valor1.ToString(CultureInfo.InvariantCulture), valor2);
                    else // Numérico
                        foreach (double valor1 in iDatosInput.AtributosNumericos[campo1.Codigo].Valores)
                            foreach (double valor2 in iDatosInput.AtributosNumericos[campo2.Codigo].Valores)
                                dGridCombinaciones.Rows.Add(valor1.ToString(CultureInfo.InvariantCulture), valor2.ToString(CultureInfo.InvariantCulture));
                else
                    foreach (double valor1 in iDatosInput.AtributosNumericos[campo1.Codigo].Valores)
                        dGridCombinaciones.Rows.Add(valor1.ToString(CultureInfo.InvariantCulture), "");

                buttonAceptar.Enabled = dGridCombinaciones.Rows.Count > 0;
        }

        private void CBoxCampo1SelectedIndexChanged(object sender, EventArgs e)
        {
            cBoxCampo2.Items.Clear();

            cBoxCampo2.Items.Add("");

            foreach (Atributo attr in iDatosInput.Entidad.Atributos)
                if (//(attr.TipoEdicion == TiposEdicion.Combo || attr.TipoEdicion == TiposEdicion.Texto) &&
                    (attr.Codigo != ModComun.XSD.Clave) &&
                    (cBoxCampo1.SelectedItem != null && attr.Nombre != (((Atributo)(cBoxCampo1.SelectedItem)).Nombre)))
                    cBoxCampo2.Items.Add(attr);

            if (tabTematicos.SelectedTab.Text == "Cualitativo")
                GenerarCombinaciones();
        }

        private void CBoxCampo2SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tabTematicos.SelectedTab.Text == "Cualitativo")
                GenerarCombinaciones();
        }

        private void GenerarRangos()
        {
            dgViewRangos.Rows.Clear();

            if (iDatosInput.AtributosNumericos[((Atributo)cBoxAtributo.SelectedItem).Codigo].Valores.Count > 0)
            {
                double minimo = iDatosInput.AtributosNumericos[((Atributo)cBoxAtributo.SelectedItem).Codigo].Minimo;
                double maximo = iDatosInput.AtributosNumericos[((Atributo)cBoxAtributo.SelectedItem).Codigo].Maximo;
                int nRangos = (int)this.numUDRangos.Value;
                double tamRango = (maximo - minimo) / nRangos;

                for (int i = 1; i <= nRangos; i++)
                    dgViewRangos.Rows.Add(minimo + (i - 1) * tamRango, minimo + i * tamRango);

                buttonAceptar.Enabled = true;
            }
            else
                buttonAceptar.Enabled = false;
        }

        private void CBoxAtributoSelectedIndexChanged(object sender, EventArgs e)
        {
            if (tabTematicos.SelectedTab.Text == "Cuantitativo")
                GenerarRangos();
        }

        private void NumUDRangosValueChanged(object sender, EventArgs e)
        {
            if (tabTematicos.SelectedTab.Text == "Cuantitativo")
                GenerarRangos();
        }

        public override void ActualizarIdiomaInterfaz()
        {
            try
            {
                base.ActualizarIdiomaInterfaz();

                this.gBoxCombinaciones.Text = Properties.Resources.Combinaciones;
                this.gBoxCampos.Text = Properties.Resources.Atributos;
                this.tabCuantitativo.Text = Properties.Resources.Cuantitativo;
                this.tabCualitativo.Text = Properties.Resources.Cualitativo;
                this.gBoxRangos.Text = Properties.Resources.Rangos;
                this.gBoxAtributos.Text = Properties.Resources.Atributos;
                this.Text = Properties.Resources.GenerarTematico;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        private void TabTematicosSelectedIndexChanged(object sender, EventArgs e)
        {
            if (((System.Windows.Forms.TabControl)sender).SelectedTab.Text == "Cuantitativo")
                GenerarRangos();
            else
                GenerarCombinaciones();
        }
    }
}