using System;
using System.Xml;


/// <summary>
/// Line end style.
/// </summary>
public enum eEndStyle   //ST_LineEndType
{
    /// <summary>
    /// No end
    /// </summary>
    None,
    /// <summary>
    /// Triangle arrow head
    /// </summary>
    Triangle,
    /// <summary>
    /// Stealth arrow head
    /// </summary>
    Stealth,
    /// <summary>
    /// Diamond
    /// </summary>
    Diamond,
    /// <summary>
    /// Oval
    /// </summary>
    Oval,
    /// <summary>
    /// Line arrow head
    /// </summary>
    Arrow
}

/// <summary>
/// Lend end size.
/// </summary>
public enum eEndSize
{
    /// <summary>
    /// Smal
    /// </summary>
    Small,
    /// <summary>
    /// Medium
    /// </summary>
    Medium,
    /// <summary>
    /// Large
    /// </summary>
    Large
}

namespace OfficeOpenXml.Drawing
{
    /// <summary>
    /// Properties for drawing line ends
    /// </summary>
    public sealed class ExcelDrawingLineEnd:XmlHelper
    {
         string _linePath;
        internal ExcelDrawingLineEnd(XmlNamespaceManager nameSpaceManager, XmlNode topNode, string linePath) : 
            base(nameSpaceManager, topNode)
        {
            SchemaNodeOrder = new string[] { "headEnd", "tailEnd" };
            _linePath = linePath;   
        }
        string _headEndStylePath = "xdr:sp/xdr:spPr/a:ln/a:headEnd/@type";
        /// <summary>
        /// HeaderEnd
        /// </summary>
        public eEndStyle HeadEnd
        {
            get
            {
                return TranslateEndStyle(GetXmlNodeString(_headEndStylePath));
            }
            set
            {
                CreateNode(_linePath, false);
                SetXmlNodeString(_headEndStylePath, TranslateEndStyleText(value));
            }
        }
        string _tailEndStylePath = "xdr:sp/xdr:spPr/a:ln/a:tailEnd/@type";
        /// <summary>
        /// HeaderEnd
        /// </summary>
        public eEndStyle TailEnd
        {
            get
            {
                return TranslateEndStyle(GetXmlNodeString(_tailEndStylePath));
            }
            set
            {
                CreateNode(_linePath, false);
                SetXmlNodeString(_tailEndStylePath, TranslateEndStyleText(value));
            }
        }

        string _tailEndSizeWidthPath = "xdr:sp/xdr:spPr/a:ln/a:tailEnd/@w";
        /// <summary>
        /// TailEndSizeWidth
        /// </summary>
        public eEndSize TailEndSizeWidth
        {
            get
            {
                return TranslateEndSize(GetXmlNodeString(_tailEndSizeWidthPath));
            }
            set
            {
                CreateNode(_linePath, false);
                SetXmlNodeString(_tailEndSizeWidthPath, TranslateEndSizeText(value));
            }
        }

        string _tailEndSizeHeightPath = "xdr:sp/xdr:spPr/a:ln/a:tailEnd/@len";
        /// <summary>
        /// TailEndSizeHeight
        /// </summary>
        public eEndSize TailEndSizeHeight
        {
            get
            {
                return TranslateEndSize(GetXmlNodeString(_tailEndSizeHeightPath));
            }
            set
            {
                CreateNode(_linePath, false);
                SetXmlNodeString(_tailEndSizeHeightPath, TranslateEndSizeText(value));
            }
        }

        string _headEndSizeWidthPath = "xdr:sp/xdr:spPr/a:ln/a:headEnd/@w";
        /// <summary>
        /// TailEndSizeWidth
        /// </summary>
        public eEndSize HeadEndSizeWidth
        {
            get
            {
                return TranslateEndSize(GetXmlNodeString(_headEndSizeWidthPath));
            }
            set
            {
                CreateNode(_linePath, false);
                SetXmlNodeString(_headEndSizeWidthPath, TranslateEndSizeText(value));
            }
        }

        string _headEndSizeHeightPath = "xdr:sp/xdr:spPr/a:ln/a:headEnd/@len";
        /// <summary>
        /// TailEndSizeHeight
        /// </summary>
        public eEndSize HeadEndSizeHeight
        {
            get
            {
                return TranslateEndSize(GetXmlNodeString(_headEndSizeHeightPath));
            }
            set
            {
                CreateNode(_linePath, false);
                SetXmlNodeString(_headEndSizeHeightPath, TranslateEndSizeText(value));
            }
        }

        #region "Translate Enum functions"
        private string TranslateEndStyleText(eEndStyle value)
        {
            return value.ToString().ToLower();
        }
        private eEndStyle TranslateEndStyle(string text)
        {
            switch (text)
            {
                case "none":
                case "arrow":
                case "diamond":
                case "oval":
                case "stealth":
                case "triangle":
                    return (eEndStyle)Enum.Parse(typeof(eEndStyle), text, true);
                default:
                    throw (new Exception("Invalid Endstyle"));
            }
        }

        private string TranslateEndSizeText(eEndSize value)
        {
            string text = value.ToString();
            switch (value)
            {
                case eEndSize.Small:
                    return "sm";
                case eEndSize.Medium:
                    return "med";
                case eEndSize.Large:
                    return "lg";
                default:
                    throw (new Exception("Invalid Endsize"));
            }
        }
        private eEndSize TranslateEndSize(string text)
        {
            switch (text)
            {
                case "sm":
                case "med":
                case "lg":
                    return (eEndSize)Enum.Parse(typeof(eEndSize), text, true);
                default:
                    throw (new Exception("Invalid Endsize"));
            }
        }
        #endregion
    }
}