using System;
using System.Collections.Generic;
using UnityEngine;
namespace XCharts.Runtime
{
    public class AxisContext : MainComponentContext
    {
        public Orient orient;
        /// 
        /// 坐标轴的起点X
        /// 
        public float x;
        /// 
        /// 坐标轴的起点Y
        /// 
        public float y;
        /// 
        /// 坐标轴原点X
        /// 
        public float zeroX;
        /// 
        /// 坐标轴原点Y
        /// 
        public float zeroY;
        public float width;
        public float height;
        public Vector3 position;
        public float left;
        public float right;
        public float bottom;
        public float top;
        /// 
        /// the current minimun value.
        /// ||当前最小值。
        /// 
        public double minValue;
        public double lastMinValue { get; internal set; }
        public double destMinValue { get; internal set; }
        /// 
        /// the current maximum value.
        /// ||当前最大值。
        /// 
        public double maxValue;
        public double lastMaxValue { get; internal set; }
        public double destMaxValue { get; internal set; }
        public bool needAnimation { get; internal set; }
        /// 
        /// the offset of zero position.
        /// ||坐标轴原点在坐标轴的偏移。
        /// 
        public float offset;
        public double minMaxRange;
        /// 
        /// the tick value of value axis.
        /// ||数值轴时每个tick的数值。
        /// 
        public double tickValue;
        public float scaleWidth;
        public float startAngle;
        public double pointerValue;
        public Vector3 pointerLabelPosition;
        public double axisTooltipValue;
        public TextAnchor aligment;
        public List runtimeData { get { return m_RuntimeData; } }
        public List labelValueList { get { return m_LabelValueList; } }
        public List labelObjectList { get { return m_AxisLabelList; } }
        public int dataZoomStartIndex;
        /// 
        /// 添加过的历史数据总数
        /// 
        public int addedDataCount;
        internal List filterData;
        internal bool lastCheckInverse;
        internal bool isNeedUpdateFilterData;
        private int filterStart;
        private int filterEnd;
        private int filterMinShow;
        private List m_AxisLabelList = new List();
        private List m_LabelValueList = new List();
        private List m_RuntimeData = new List();
        internal void Clear()
        {
            addedDataCount = 0;
            m_RuntimeData.Clear();
        }
        private List m_EmptyFliter = new List();
        /// 
        /// 更新dataZoom对应的类目数据列表
        /// 
        /// 
        internal void UpdateFilterData(List data, DataZoom dataZoom)
        {
            int start = 0, end = 0;
            var range = Mathf.RoundToInt(data.Count * (dataZoom.end - dataZoom.start) / 100);
            if (range <= 0)
                range = 1;
            if (dataZoom.context.invert)
            {
                end = Mathf.RoundToInt(data.Count * dataZoom.end / 100);
                start = end - range;
                if (start < 0) start = 0;
            }
            else
            {
                start = Mathf.RoundToInt(data.Count * dataZoom.start / 100);
                end = start + range;
                if (end > data.Count) end = data.Count;
            }
            if (start != filterStart ||
                end != filterEnd ||
                dataZoom.minShowNum != filterMinShow ||
                isNeedUpdateFilterData)
            {
                filterStart = start;
                filterEnd = end;
                filterMinShow = dataZoom.minShowNum;
                isNeedUpdateFilterData = false;
                if (data.Count > 0)
                {
                    if (range < dataZoom.minShowNum)
                    {
                        if (dataZoom.minShowNum > data.Count)
                            range = data.Count;
                        else
                            range = dataZoom.minShowNum;
                    }
                    if (range > data.Count - start)
                        start = data.Count - range;
                    if (start >= 0)
                    {
                        dataZoomStartIndex = start;
                        filterData = data.GetRange(start, range);
                    }
                    else
                    {
                        dataZoomStartIndex = 0;
                        filterData = data;
                    }
                }
                else
                {
                    dataZoomStartIndex = 0;
                    filterData = data;
                }
            }
            else if (end == 0)
            {
                dataZoomStartIndex = 0;
                filterData = m_EmptyFliter;
            }
        }
    }
}