using System;
using System.Collections.Generic;
using UnityEngine;
namespace XCharts.Runtime
{
    /// 
    /// Legend component.The legend component shows different sets of tags, colors, and names. 
    /// You can control which series are not displayed by clicking on the legend.
    /// ||图例组件。
    /// 图例组件展现了不同系列的标记,颜色和名字。可以通过点击图例控制哪些系列不显示。
    /// 
    [System.Serializable]
    [ComponentHandler(typeof(LegendHandler), true)]
    public class Legend : MainComponent, IPropertyChanged
    {
        public enum Type
        {
            /// 
            /// 自动匹配。
            /// 
            Auto,
            /// 
            /// 自定义图标。
            /// 
            Custom,
            /// 
            /// 空心圆。
            /// 
            EmptyCircle,
            /// 
            /// 圆形。
            /// 
            Circle,
            /// 
            /// 正方形。可通过Setting的legendIconCornerRadius参数调整圆角。
            /// 
            Rect,
            /// 
            /// 三角形。
            /// 
            Triangle,
            /// 
            /// 菱形。
            /// 
            Diamond,
            /// 
            /// 烛台(可用于K线图)。
            /// 
            Candlestick,
        }
        /// 
        /// Selected mode of legend, which controls whether series can be toggled displaying by clicking legends.
        /// ||图例选择的模式,控制是否可以通过点击图例改变系列的显示状态。默认开启图例选择,可以设成 None 关闭。
        /// 
        public enum SelectedMode
        {
            /// 
            /// 多选。
            /// 
            Multiple,
            /// 
            /// 单选。
            /// 
            Single,
            /// 
            /// 无法选择。
            /// 
            None
        }
        [SerializeField] private bool m_Show = true;
        [SerializeField] private Type m_IconType = Type.Auto;
        [SerializeField] private SelectedMode m_SelectedMode = SelectedMode.Multiple;
        [SerializeField] private Orient m_Orient = Orient.Horizonal;
        [SerializeField] private Location m_Location = new Location() { align = Location.Align.TopCenter, top = 0.125f };
        [SerializeField] private float m_ItemWidth = 25.0f;
        [SerializeField] private float m_ItemHeight = 12.0f;
        [SerializeField] private float m_ItemGap = 10f;
        [SerializeField] private bool m_ItemAutoColor = true;
        [SerializeField] private float m_ItemOpacity = 1;
        [SerializeField] private string m_Formatter;
        [SerializeField] private LabelStyle m_LabelStyle = new LabelStyle();
        [SerializeField][Since("v3.10.0")] private TextLimit m_TextLimit = new TextLimit();
        [SerializeField] private List m_Data = new List();
        [SerializeField] private List m_Icons = new List();
        [SerializeField] private List m_Colors = new List();
        [SerializeField][Since("v3.1.0")] protected ImageStyle m_Background = new ImageStyle() { show = false };
        [SerializeField][Since("v3.1.0")] protected Padding m_Padding = new Padding();
        [SerializeField][Since("v3.6.0")] private List m_Positions = new List();
        public LegendContext context = new LegendContext();
        /// 
        /// Whether to show legend component.
        /// ||是否显示图例组件。
        /// 
        public bool show
        {
            get { return m_Show; }
            set { if (PropertyUtil.SetStruct(ref m_Show, value)) SetComponentDirty(); }
        }
        /// 
        /// Type of legend.
        /// ||图例类型。
        /// 
        public Type iconType
        {
            get { return m_IconType; }
            set { if (PropertyUtil.SetStruct(ref m_IconType, value)) SetAllDirty(); }
        }
        /// 
        /// Selected mode of legend, which controls whether series can be toggled displaying by clicking legends.
        /// ||选择模式。控制是否可以通过点击图例改变系列的显示状态。默认开启图例选择,可以设成 None 关闭。
        /// 
        public SelectedMode selectedMode
        {
            get { return m_SelectedMode; }
            set { if (PropertyUtil.SetStruct(ref m_SelectedMode, value)) SetComponentDirty(); }
        }
        /// 
        /// Specify whether the layout of legend component is horizontal or vertical.
        /// ||布局方式是横还是竖。
        /// 
        public Orient orient
        {
            get { return m_Orient; }
            set { if (PropertyUtil.SetStruct(ref m_Orient, value)) SetComponentDirty(); }
        }
        /// 
        /// The location of legend.
        /// ||图例显示的位置。
        /// 
        public Location location
        {
            get { return m_Location; }
            set { if (PropertyUtil.SetClass(ref m_Location, value)) SetComponentDirty(); }
        }
        /// 
        /// Image width of legend symbol.
        /// ||图例标记的图形宽度。
        /// 
        public float itemWidth
        {
            get { return m_ItemWidth; }
            set { if (PropertyUtil.SetStruct(ref m_ItemWidth, value)) SetComponentDirty(); }
        }
        /// 
        /// Image height of legend symbol.
        /// ||图例标记的图形高度。
        /// 
        public float itemHeight
        {
            get { return m_ItemHeight; }
            set { if (PropertyUtil.SetStruct(ref m_ItemHeight, value)) SetComponentDirty(); }
        }
        /// 
        /// The distance between each legend, horizontal distance in horizontal layout, and vertical distance in vertical layout.
        /// ||图例每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。
        /// 
        public float itemGap
        {
            get { return m_ItemGap; }
            set { if (PropertyUtil.SetStruct(ref m_ItemGap, value)) SetComponentDirty(); }
        }
        /// 
        /// Whether the legend symbol matches the color automatically.
        /// ||图例标记的图形是否自动匹配颜色。
        /// 
        public bool itemAutoColor
        {
            get { return m_ItemAutoColor; }
            set { if (PropertyUtil.SetStruct(ref m_ItemAutoColor, value)) SetComponentDirty(); }
        }
        /// 
        /// the opacity of item color.
        /// ||图例标记的图形的颜色透明度。
        /// 
        public float itemOpacity
        {
            get { return m_ItemOpacity; }
            set { if (PropertyUtil.SetStruct(ref m_ItemOpacity, value)) SetComponentDirty(); }
        }
        /// 
        /// No longer used, the use of LabelStyle.formatter instead.
        /// ||不再使用,使用LabelStyle.formatter代替。
        /// 
        [Obsolete("Use LabelStyle.formatter instead.", false)]
        public string formatter
        {
            get { return m_Formatter; }
            set { if (PropertyUtil.SetClass(ref m_Formatter, value)) SetComponentDirty(); }
        }
        /// 
        /// the style of text.
        /// ||文本样式。
        /// 
        public LabelStyle labelStyle
        {
            get { return m_LabelStyle; }
            set { if (PropertyUtil.SetClass(ref m_LabelStyle, value)) SetComponentDirty(); }
        }
        /// 
        /// the limit of text. 
        /// ||文本限制。
        /// 
        public TextLimit textLimit
        {
            get { return m_TextLimit; }
            set { if (value != null) { m_TextLimit = value; SetComponentDirty(); } }
        }
        /// 
        /// the sytle of background.
        /// ||背景图样式。
        /// 
        public ImageStyle background
        {
            get { return m_Background; }
            set { if (PropertyUtil.SetClass(ref m_Background, value)) SetAllDirty(); }
        }
        /// 
        /// the paddinng of item and background.
        /// ||图例标记和背景的间距。
        /// 
        public Padding padding
        {
            get { return m_Padding; }
            set { if (PropertyUtil.SetClass(ref m_Padding, value)) SetAllDirty(); }
        }
        /// 
        /// Data array of legend. An array item is usually a name representing string. (If it is a pie chart, 
        /// it could also be the name of a single data in the pie chart) of a series.
        /// If data is not specified, it will be auto collected from series.
        /// ||图例的数据数组。数组项通常为一个字符串,每一项代表一个系列的 name(如果是饼图,也可以是饼图单个数据的 name)。
        /// 如果 data 没有被指定,会自动从当前系列中获取。指定data时里面的数据项和serie匹配时才会生效。
        /// 
        public List data
        {
            get { return m_Data; }
            set { if (value != null) { m_Data = value; SetComponentDirty(); } }
        }
        /// 
        /// 自定义的图例标记图形。
        /// 
        public List icons
        {
            get { return m_Icons; }
            set { if (value != null) { m_Icons = value; SetComponentDirty(); } }
        }
        /// 
        /// the colors of legend item.
        /// ||图例标记的颜色列表。
        /// 
        public List colors
        {
            get { return m_Colors; }
            set { if (value != null) { m_Colors = value; SetAllDirty(); } }
        }
        /// 
        /// the custom positions of legend item.
        /// ||图例标记的自定义位置列表。
        /// 
        public List positions
        {
            get { return m_Positions; }
            set { if (value != null) { m_Positions = value; SetAllDirty(); } }
        }
        /// 
        /// 图表是否需要刷新(图例组件不需要刷新图表)
        /// 
        public override bool vertsDirty { get { return false; } }
        /// 
        /// 组件是否需要刷新
        /// 
        public override bool componentDirty
        {
            get { return m_ComponentDirty || location.componentDirty || labelStyle.componentDirty || textLimit.componentDirty; }
        }
        public override void ClearComponentDirty()
        {
            base.ClearComponentDirty();
            location.ClearComponentDirty();
            labelStyle.ClearComponentDirty();
            textLimit.ClearComponentDirty();
        }
        /// 
        /// Clear legend data.
        /// ||清空。
        /// 
        public override void ClearData()
        {
            m_Data.Clear();
            SetComponentDirty();
        }
        /// 
        /// Whether include in legend data by the specified name.
        /// ||是否包括由指定名字的图例
        /// 
        /// 
        /// 
        public bool ContainsData(string name)
        {
            return m_Data.Contains(name);
        }
        /// 
        /// Removes the legend with the specified name.
        /// ||移除指定名字的图例。
        /// 
        /// 
        public void RemoveData(string name)
        {
            if (m_Data.Contains(name))
            {
                m_Data.Remove(name);
                SetComponentDirty();
            }
        }
        /// 
        /// Add legend data.
        /// ||添加图例。
        /// 
        /// 
        public void AddData(string name)
        {
            if (!m_Data.Contains(name) && !string.IsNullOrEmpty(name))
            {
                m_Data.Add(name);
                SetComponentDirty();
            }
        }
        /// 
        /// Gets the legend for the specified index.
        /// ||获得指定索引的图例。
        /// 
        /// 
        /// 
        public string GetData(int index)
        {
            if (index >= 0 && index < m_Data.Count)
            {
                return m_Data[index];
            }
            return null;
        }
        /// 
        /// Gets the index of the specified legend.
        /// ||获得指定图例的索引。
        /// 
        /// 
        /// 
        public int GetIndex(string legendName)
        {
            return m_Data.IndexOf(legendName);
        }
        /// 
        /// Remove all legend buttons.
        /// ||移除所有图例按钮。
        /// 
        public void RemoveButton()
        {
            context.buttonList.Clear();
        }
        /// 
        /// Bind buttons to legends.
        /// ||给图例绑定按钮。
        /// 
        /// 
        /// 
        /// 
        public void SetButton(string name, LegendItem item, int total)
        {
            context.buttonList[name] = item;
            int index = context.buttonList.Values.Count;
            item.SetIconActive(iconType == Type.Custom);
            item.SetActive(show);
        }
        /// 
        /// Update the legend button color.
        /// ||更新图例按钮颜色。
        /// 
        /// 
        /// 
        public void UpdateButtonColor(string name, Color color)
        {
            if (context.buttonList.ContainsKey(name))
            {
                context.buttonList[name].SetIconColor(color);
            }
        }
        /// 
        /// Update the text color of legend.
        /// ||更新图例文字颜色。
        /// 
        /// 
        /// 
        public void UpdateContentColor(string name, Color color)
        {
            if (context.buttonList.ContainsKey(name))
            {
                context.buttonList[name].SetContentColor(color);
            }
        }
        /// 
        /// Gets the legend button for the specified index.
        /// ||获得指定索引的图例按钮。
        /// 
        /// 
        /// 
        public Sprite GetIcon(int index)
        {
            if (index >= 0 && index < m_Icons.Count)
            {
                return m_Icons[index];
            }
            else
            {
                return null;
            }
        }
        public Color GetColor(int index)
        {
            if (index >= 0 && index < m_Colors.Count)
                return m_Colors[index];
            else
                return Color.white;
        }
        public Vector3 GetPosition(int index, Vector3 defaultPos)
        {
            if (index >= 0 && index < m_Positions.Count)
                return m_Positions[index];
            else
                return defaultPos;
        }
        /// 
        /// Callback handling when parameters change.
        /// ||参数变更时的回调处理。
        /// 
        public void OnChanged()
        {
            m_Location.OnChanged();
        }
    }
}