using System;
using System.Xml.Linq;

namespace Novacode
{
    /// <summary>
    /// This element contains the 2-D bar or column series on this chart.
    /// 21.2.2.16 barChart (Bar Charts)
    /// </summary>
    public class BarChart : Chart
    {
        /// <summary>
        /// Specifies the possible directions for a bar chart.
        /// </summary>
        public BarDirection BarDirection
        {
            get
            {
                return XElementHelpers.GetValueToEnum<BarDirection>(
                    ChartXml.Element(XName.Get("barDir", DocX.c.NamespaceName)));
            }
            set
            {
                XElementHelpers.SetValueFromEnum<BarDirection>(
                    ChartXml.Element(XName.Get("barDir", DocX.c.NamespaceName)), value);
            }
        }

        /// <summary>
        /// Specifies the possible groupings for a bar chart.
        /// </summary>
        public BarGrouping BarGrouping
        {
            get
            {
                return XElementHelpers.GetValueToEnum<BarGrouping>(
                    ChartXml.Element(XName.Get("grouping", DocX.c.NamespaceName)));
            }
            set
            {
                XElementHelpers.SetValueFromEnum<BarGrouping>(
                    ChartXml.Element(XName.Get("grouping", DocX.c.NamespaceName)), value);
            }
        }

        /// <summary>
        /// Specifies that its contents contain a percentage between 0% and 500%.
        /// </summary>
        public Int32 GapWidth
        {
            get
            {
                return Convert.ToInt32(
                    ChartXml.Element(XName.Get("gapWidth", DocX.c.NamespaceName)).Attribute(XName.Get("val")).Value);
            }
            set
            {
                if ((value < 1) || (value > 500))
                    throw new ArgumentException("GapWidth lay between 0% and 500%!");
                ChartXml.Element(XName.Get("gapWidth", DocX.c.NamespaceName)).Attribute(XName.Get("val")).Value = value.ToString();
            }
        }

        protected override XElement CreateChartXml()
        {
            return XElement.Parse(
                @"<c:barChart xmlns:c=""http://schemas.openxmlformats.org/drawingml/2006/chart"">
                    <c:barDir val=""col""/>
                    <c:grouping val=""clustered""/>                    
                    <c:gapWidth val=""150""/>
                  </c:barChart>");
        }
    }

    /// <summary>
    /// Specifies the possible directions for a bar chart.
    /// 21.2.3.3 ST_BarDir (Bar Direction)
    /// </summary>
    public enum BarDirection
    {
        [XmlName("col")]
        Column,
        [XmlName("bar")]
        Bar
    }

    /// <summary>
    /// Specifies the possible groupings for a bar chart.
    /// 21.2.3.4 ST_BarGrouping (Bar Grouping)
    /// </summary>
    public enum BarGrouping
    {
        [XmlName("clustered")]
        Clustered,
        [XmlName("percentStacked")]
        PercentStacked,
        [XmlName("stacked")]
        Stacked,
        [XmlName("standard")]
        Standard
    }
}
