using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices;
using System.Text;

namespace GMLC01HerramientasCad.Logica
{
    public enum TipoTematico
    {
        Cuantitativo,
        Cualitativo
    }

    /// <summary>
    /// Definición del criterio de definición de temáticos a transmitir al módulo CAD
    /// </summary>
    public class CriterioTematicos
    {
        public TipoTematico Tipo { get; internal set; }
        public Entidad Entidad { get; internal set; }
        public Atributo Atributo1 { get; internal set; }
        public Atributo Atributo2 { get; internal set; }
        public Collection<RangoTematico> Rangos { get; internal set; }
    }

    public class RangoTematico
    {
        public RangoTematico(double min, double max)
        {
            try
            {
                Minimo = min;
                Maximo = max;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        public double Minimo { get; set; }
        public double Maximo { get; set; }
    }

    public class TematicoAtributoNumerico
    {
        private Collection<double> iValores;
        public TematicoAtributoNumerico(Atributo atributo, Collection<double> valores)
        {
            try
            {
                Atributo = atributo;
                Valores = valores;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        public Atributo Atributo { get; set; }
        public Collection<double> Valores { get { return iValores; }
                                            internal set
                                            {
                                                iValores = value;
                                                Minimo = double.MaxValue;
                                                Maximo = double.MinValue;

                                                foreach (double val in iValores)
                                                {
                                                    if (val < Minimo)
                                                        Minimo = val;
                                                    if (val > Maximo)
                                                        Maximo = val;
                                                }
                                            }
        }
        public double Minimo { get; internal set; }
        public double Maximo { get; internal set; }
    }

    public class TematicoAtributoTexto
    {
        public TematicoAtributoTexto(Atributo atributo, Collection<String> valores)
        {
            try
            {
                Atributo = atributo;
                Valores = valores;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }
        public Atributo Atributo { get; set; }
        public Collection<String> Valores { get; internal set; }
        public String Nombre { get { return Atributo.Nombre; } }
    }

    public class TematicoDatosInput
    {
        public TematicoDatosInput(Entidad entidad,
                            AtributosNumericos atributosNumericos,
                            AtributosTexto atributosTexto)
        {
            try
            {
                Entidad = entidad;
                AtributosNumericos = atributosNumericos;
                AtributosTexto = atributosTexto;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        public Entidad Entidad { get; set; }
        public AtributosNumericos AtributosNumericos { get; internal set; }
        public AtributosTexto AtributosTexto { get; internal set; }
    }

    [ComVisible(false)]
    public class AtributosNumericos : KeyedCollection<String, TematicoAtributoNumerico>
    {
        protected override string GetKeyForItem(TematicoAtributoNumerico item)
        {
            return item.Atributo.Codigo;
        }
    }

    [ComVisible(false)]
    public class AtributosTexto : KeyedCollection<String, TematicoAtributoTexto>
    {
        protected override string GetKeyForItem(TematicoAtributoTexto item)
        {
            return item.Atributo.Codigo;
        }
    }
}
