using System;
using System.Collections;
using System.Text;

using CategoryTheory;

namespace DiagramUI
{
    public class PureArrowLabel : IArrowLabel
    {
        protected string name;
        protected string kind;
        protected string type;
        protected int x;
        protected int y;
        protected IDesktop desktop;
        protected PureObjectLabel source;
        protected PureObjectLabel target;
        protected ICategoryArrow arrow;
        protected object sourceNumber;
        protected object targetNumber;
        /// <summary>
        /// Parent component
        /// </summary>
        public INamedComponent parent;


        protected PureArrowLabel()
        {
        }
        public PureArrowLabel(string name, string kind, string type, int x, int y)
        {
            this.name = name;
            this.kind = kind;
            this.type = type;
            this.x = x;
            this.y = y;
        }

        #region IArrowLabel Members

        public ICategoryArrow Arrow
        {
            get
            {
                return arrow;
            }
            set
            {
                arrow = value;
            }
        }

        public IObjectLabel Source
        {
            get
            {
                return source;
            }
            set
            {
                source = value as PureObjectLabel;
            }
        }

        public IObjectLabel Target
        {
            get
            {
                return target;
            }
            set
            {
                target = value as PureObjectLabel;
            }
        }

        public object SourceNumber
        {
            get
            {
                return sourceNumber;
            }
            set
            {
                sourceNumber = value;
            }
        }

        public object TargetNumber
        {
            get
            {
                return targetNumber;
            }
            set
            {
                targetNumber = value;
            }
        }

        #endregion

        #region INamedComponent Members

        public string Name
        {
            get
            {
                return name;
            }
        }

        public string Kind
        {
            get
            {
                return kind;
            }
        }

        public string Type
        {
            get
            {
                return type;
            }
        }

        public void Remove()
        {
        }

        public int X
        {
            get
            {
                return x;
            }
            set
            {
                x = value;
            }
        }

        public int Y
        {
            get
            {
                return y;
            }
            set
            {
                y = value;
            }
        }

        public IDesktop Desktop
        {
            get
            {
                return desktop;
            }
            set
            {
                desktop = value;
            }
        }

        public int Ord
        {
            get
            {
                return desktop.Components.IndexOf(this);
            }
        }

        /// <summary>
        /// Parent component
        /// </summary>
        public INamedComponent Parent
        {
            get
            {
                return parent;
            }
            set
            {
                parent = value;
            }
        }

        public INamedComponent GetRoot(IDesktop desktop)
        {
            return PureObjectLabel.GetRoot(this, desktop);
        }


        /// <summary>
        /// Gets component name relatively desktop
        /// </summary>
        /// <param name="desktop">The desktop</param>
        /// <returns>Relalive name</returns>
        public virtual string GetName(IDesktop desktop)
        {
            return PureObjectLabel.GetName(this, desktop);
        }

        /// <summary>
        /// Gets name relatively root
        /// </summary>
        public string RootName
        {
            get
            {
                return GetName(Desktop.Root);
            }
        }


        /// <summary>
        /// Root control
        /// </summary>
        public INamedComponent Root
        {
            get
            {
                return PureObjectLabel.GetRoot(this);
            }
        }


        #endregion

        #region Specific members

        public void SetType()
        {
            kind = Arrow.GetType().ToString();
        }

        public static void SetType(ICollection c)
        {
            foreach (PureArrowLabel l in c)
            {
                l.SetType();
            }
        }


        static public void SetLabels(ICollection c)
        {
            foreach (IArrowLabel l in c)
            {
                ICategoryArrow a = l.Arrow;
                a.Object = l;
            }
        }
        #endregion


    }
}
