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

namespace GMLC01HerramientasCad.Logica
{
    /// <summary>
    /// Tipos de geometría de las entidad
    /// </summary>
    public enum TiposGeometria
    {
        /// <summary>
        /// </summary>
        Punto,
        /// <summary>
        /// </summary>
        Linea,
        /// <summary>
        /// </summary>
        Area
    }

    /// <summary>
    /// Definición de la entidad para transferenicia con el módulo CAD
    /// </summary>
    public class Entidad
    {
        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="codigo">Código de la entidad según aparece en el XSD</param>
        /// <param name="nombres">Nombres de la entidad en los diferentes idiomas soportados en el XSD</param>
        /// <param name="descripciones">Descripciones de la entidad en los diferentes idiomas soportados en el XSD</param>
        /// <param name="tipoGeometria">Tipo de geometría a digitalizar</param>
        /// <param name="categoria">Categoría a la que pertenece la entidad</param>
        /// <param name="campoSubTipo">Nombre del atributo de la entidad que se usará para determinar el subtipo</param>
        /// <param name="subTipos">Lista de subtipos definidos por <paramref name="campoSubTipo"/></param>
        /// <param name="atributos">Lista de atributos de la entidad</param>
        public Entidad(String codigo,
                       Dictionary<String, String> nombres, Dictionary<String, String> descripciones,
                       TiposGeometria tipoGeometria, Categoria categoria,
                       String campoSubTipo, Collection<SubTipo> subTipos,
                       ListaAtributos atributos)
        {
            try
            {
                Codigo = codigo;
                Nombres = nombres;
                Descripciones = descripciones;
                TipoGeometria = tipoGeometria;
                CampoSubTipo = campoSubTipo;
                SubTipos = subTipos;
                Categoria = categoria;
                Atributos = atributos;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

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

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

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

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

        /// <summary>
        /// iDescripcion a mostrar de la entidad según el idioma activo
        /// </summary>
        public String Descripcion
        {
            get { return Descripciones[ModComun.Idioma]; }
        }

        /// <summary>
        /// Tipo de geometría de la entidad y sus posibles subtipos
        /// </summary>
        public TiposGeometria TipoGeometria { get; internal set; }

        /// <summary>
        /// Categoría a la que pertenece la entidad
        /// </summary>
        public Categoria Categoria { get; internal set; }

        /// <summary>
        /// Campo discriminante de subtipo
        /// </summary>
        public String CampoSubTipo { get; internal set; }

        /// <summary>
        /// Lista de subtipos de la entidad
        /// </summary>
        public Collection<SubTipo> SubTipos { get; internal set; }

        /// <summary>
        /// Lista de atributos de la entidad
        /// </summary>
        public ListaAtributos Atributos { get; internal set; }

        /// <summary>
        /// Nombre para presentar en combos (Categoría - Entidad)
        /// </summary>
        public String NombreComboDisplay
        {
            get
            {
                return this.Categoria.Nombre + " - " + this.Nombre;
            }
        }
    }

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