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

namespace GMLC01HerramientasCad.Logica
{
    /// <summary>
    /// Definición de la categoría para transferenicia con el módulo CAD
    /// </summary>
    public class Categoria
    {
        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="codigo">Código de la categoría según aparece en el XSD</param>
        /// <param name="nombres">Nombres de la categoría en los diferentes idiomas soportados en el XSD</param>
        /// <param name="descripciones">Descripciones de la categoría en los diferentes idiomas soportados en el XSD</param>
        /// <param name="entidades">Lista de entidades de la categoría</param>
        public Categoria(String codigo, Dictionary<String, String> nombres, Dictionary<String, String> descripciones, Collection<Entidad> entidades)
        {
            try
            {
                Codigo = codigo;
                Nombres = nombres;
                Descripciones = descripciones;
                Entidades = entidades;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        /// <summary>
        /// Código de la categoría
        /// </summary>
        public string Codigo { get; internal set; }

        /// <summary>
        /// Nombres de la categoría en los diferentes idiomas soportados en el XSD
        /// </summary>
        public Dictionary<string, string> Nombres { get; internal set; }

        /// <summary>
        /// Nombre a mostrar de la categoría según el idioma activo
        /// </summary>
        public String Nombre
        {
            get { return Nombres[ModComun.Idioma]; }
        }

        /// <summary>
        /// Descripciones de la categoría en los diferentes idiomas soportados en el XSD
        /// </summary>
        public Dictionary<string, string> Descripciones { get; internal set; }

        /// <summary>
        /// Descripción de la categoría según el idioma activo
        /// </summary>
        public String Descripcion
        {
            get { return Descripciones[ModComun.Idioma]; }
        }

        /// <summary>
        /// Lista de entidades de la categoría
        /// </summary>
        public Collection<Entidad> Entidades {get; internal set;}
    }

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