using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Media;
using MECF.Framework.UI.Client.ClientBase.Tree;
using SciChart.Charting.Visuals.RenderableSeries;
namespace MECF.Framework.UI.Client.ClientBase.Charting
{
    public class FastLineSeries : FastLineRenderableSeries, INotifyPropertyChanged
    {
        private double _dataFactor = 1.0;
        private double _dataOffset = 0.0;
        public event PropertyChangedEventHandler PropertyChanged;
        #region Constructors
        public FastLineSeries(string dataName)
            : this(dataName, dataName, Colors.Black)
        {
        }
        public FastLineSeries(string dataName, string displayName, Color seriesColor, int? fifoCapacity = null)
        {
            UniqueId = Guid.NewGuid().ToString();
            Stroke = seriesColor;
            IsVisible = true;
            LineThickness = 1.0;
            XAxisId = "DefaultAxisId";
            YAxisId = "DefaultAxisId";
            
            DataFactor = 1.0;
            DataOffset = 0.0;
            
            DataSeries = new FastLineDataSeries()
            {
                SeriesName = dataName,
                FifoCapacity = fifoCapacity,
                Factor = DataFactor,
                Offset = DataOffset
            };
            
            //! 注意目前的程序要求 DataSeries.SeriesName 必须等于 DataName.
            DisplayName = displayName;
            DataName = dataName;
        }
        #endregion
        #region Properties
        public string UniqueId { get; }
        public string DataName { get; }
        public string DisplayName
        {
            get => DataSeries.SeriesName;
            set => DataSeries.SeriesName = value;
        }
        public double LineThickness
        {
            get => StrokeThickness;
            set
            {
                var num = Convert.ToInt32(value);
                if (num < 1)
                    num = 1;
                if (num > 100)
                    num = 100;
                StrokeThickness = num;
                InvokePropertyChanged();
            }
        }
        public double DataFactor
        {
            get => _dataFactor;
            set
            {
                if (Math.Abs(_dataFactor - value) <= 0.001)
                    return;
                _dataFactor = value;
                GetDataSeries().Factor = _dataFactor;
                InvokePropertyChanged();
                UpdateChartSeriesValue();
            }
        }
        public double DataOffset
        {
            get => _dataOffset;
            set
            {
                if (Math.Abs(_dataOffset - value) <= 0.001)
                    return;
                _dataOffset = value;
                GetDataSeries().Offset = _dataOffset;
                InvokePropertyChanged();
                UpdateChartSeriesValue();
            }
        }
        public TreeNode BackendParameterNode { get; set; }
        #endregion
        #region Methods
        /// 
        /// 获取XyDataSeries类型的DataSeries对象
        /// 
        /// 
        public FastLineDataSeries GetDataSeries()
        {
            return DataSeries as FastLineDataSeries;
        }
        /// 
        /// /
        /// 
        public void UpdateChartSeriesValue()
        {
            using (DataSeries.SuspendUpdates())
            {
                var ds = GetDataSeries();
                for (var i = 0; i < ds.Count; i++)
                {
                    var y = (ds.Metadata[i] as ParameterNodePoint)?.Value;
                    if (y == null)
                        continue;
                    ds.Update(i, (double)y * _dataFactor + DataOffset);
                }
                //var dataSeries = DataSeries as XyDataSeries;
                //for (var index = 0; index < dataSeries.Count; ++index)
                //    dataSeries.Update(index, _queueRawData.ElementAt(index).Item2 * _dataFactor + _dataOffset);
            }
        }
        public void ClearData()
        {
            DataSeries.Clear();
        }
        
        
        private void InvokePropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (string.IsNullOrEmpty(propertyName))
                return;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        public override string ToString()
        {
            return DataName;
        }
        #endregion
    }
}