using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Xml;

namespace GMLC01HerramientasCad.Logica
{
    /// <summary>
    /// Definición del elemento para transferencia con el módulo CAD
    /// </summary>
    public class Elemento
    {

        public Elemento()
        {
            try
            {
                Coordenadas = new Collection<Coordenada>();
                Interiores = new Collection<Ring>();
                Atributos = new ListaAtributos();
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        private String iCodigoEntidad;

        /// <summary>
        /// Identificador interno
        /// </summary>
        public long IdInterno { get; set; }

        /// <summary>
        /// Código de la entidad del elemento
        /// </summary>
        public String CodigoEntidad
        {
            get { return iCodigoEntidad; }
            set
            {
                iCodigoEntidad = value;

                Atributos = null;
                Entidad = ModComun.XSD.Entidades[iCodigoEntidad];

                Atributos = new ListaAtributos();
                foreach (Atributo atr in Entidad.Atributos)
                {
                    Atributo x = (Atributo)atr.Clone();

                    Atributos.Add(x);
                }
            }
        }

        /// <summary>
        /// Entidad del elemento
        /// </summary>
        public Entidad Entidad { get; internal set; }

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

        /// <summary>
        /// Lista de coordenadas del elemento
        /// </summary>
        public Collection<Coordenada> Coordenadas { get; internal set; }

        /// <summary>
        /// Colección de anillos interiores
        /// </summary>
        public Collection<Ring> Interiores { get; internal set; }
    }

    /// <summary>
    /// 
    /// </summary>
    public class Ring
    {
        private Collection<Coordenada> iCoordenadas;

        public Ring()
        {
            iCoordenadas = new Collection<Coordenada>();
        }

        public Collection<Coordenada> Coordenadas { get {return iCoordenadas;} }
    }

    /// <summary>
    /// Coordenada X,Y,Z de un elemento
    /// </summary>
    public class Coordenada
    {
        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="xCoord">X de la coordenada</param>
        /// <param name="yCoord">Y de la coordenada</param>
        /// <param name="zCoord">Z de la coordenada</param>
        public Coordenada(Double xCoord, Double yCoord, Double zCoord)
        {
            try
            {
                CoordX = xCoord;
                CoordY = yCoord;
                CoordZ = zCoord;
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new ExcepcionGMLC(e.Message, e);
            }
        }

        /// <summary>
        /// X de la coordenada
        /// </summary>
        public Double CoordX { get; set; }

        /// <summary>
        /// Y de la coordenada
        /// </summary>
        public Double CoordY { get; set; }

        /// <summary>
        /// Z de la coordenada
        /// </summary>
        public Double CoordZ { get; set; }
    }
}