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

namespace GMLC01HerramientasCad.Logica
{
    /// <summary>
    /// Define un dominio de valores para los campos de las entidades
    /// </summary>
    public class Dominio
    {
        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="codigo"></param>
        public Dominio(String codigo)
        {
            try
            {
                Codigo = codigo;
                Valores = new Collection<ValorDominio>();
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        /// <summary>
        /// Código del dominio
        /// </summary>
        public String Codigo { get; internal set; }

        /// <summary>
        /// Lista de valores del dominio
        /// </summary>
        public Collection<ValorDominio> Valores { get; internal set; }
    }

    /// <summary>
    /// Define una entrada del dominio
    /// </summary>
    public class ValorDominio
    {
        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="codigo">Código del dominio</param>
        /// <param name="textos">Textos del valor de dominio en los diferentes idiomas soportados</param>
        /// <param name="descripciones">Descripciones del valor de dominio en los diferentes idiomas soportados</param>
        public ValorDominio(String codigo,
                        Dictionary<string, string> textos,
                        Dictionary<string, string> descripciones)
        {
            try
            {
                Codigo = codigo;
                Textos = textos;
                Descripciones = descripciones;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        /// <summary>
        /// Código del dominio
        /// </summary>
        public String Codigo { get; internal set; }

        /// <summary>
        /// Texto del valor de dominio en los diferentes idiomas soportados en el XSD
        /// </summary>
        public Dictionary<string, string> Textos { get; internal set; }

        /// <summary>
        /// Texto del valor de dominio
        /// </summary>
        public String Texto
        {
            get { return Textos[ModComun.Idioma]; }
        }

        /// <summary>
        /// Descripciones del valor de dominio en los diferentes idiomas soportados en el XSD
        /// </summary>
        public Dictionary<string, string> Descripciones { get; internal set; }

        /// <summary>
        /// Descripción del valor de dominio según el idioma activo
        /// </summary>
        public String Descripcion
        {
            get { return Descripciones[ModComun.Idioma]; }
        }
    }

    /// <summary>
    /// Lista de dominios con accesibilidad por clave
    /// </summary>
    /// 
    [ComVisible(false)]
    public class ListaDominios : KeyedCollection<String, Dominio>
    {
        /// <summary>
        /// Define el código del dominio como clave de búsqueda en la lista
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        protected override string GetKeyForItem(Dominio item)
        {
            return item.Codigo;
        }
    }
}
