using LiveCharts;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using Microsoft.Win32;
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.IO;
using System.Linq;
using System.Windows.Threading;
using CyberX8_MainPages.Unity;
using Venus_Unity;

namespace CyberX8_MainPages.ViewModels
{
    internal class VATPerformanceViewModel : BindableBase
    {
        #region 私有字段
        private int m_GasFlow;
        private int m_GasTime;

        private int m_GasSelectedIndex;
        public string ModuleName;
        ChartValues<double> m_CurrentLineSeries = new ChartValues<double>();
        ChartValues<double> m_ReferenceLineSeries = new ChartValues<double>();
        DispatcherTimer timer = new DispatcherTimer();
        VATPerformanceResult m_VATPerformanceResult;
        private bool m_MFC7IsEnable;
        private bool m_MFC8IsEnable;
        private bool m_IsAutoMode;

        #endregion

        #region 属性

        public int GasFlow
        {
            get { return m_GasFlow; }
            set { SetProperty(ref m_GasFlow, value); }
        }
        public int GasTime
        {
            get { return m_GasTime; }
            set { SetProperty(ref m_GasTime, value); }
        }
        public int GasSelectedIndex
        {
            get { return m_GasSelectedIndex; }
            set { SetProperty(ref m_GasSelectedIndex, value); }
        }
        public ChartValues<double> CurrentLineSeries
        {
            get { return m_CurrentLineSeries; }
            set { SetProperty(ref m_CurrentLineSeries, value); }
        }
        public ChartValues<double> ReferenceLineSeries
        {
            get { return m_ReferenceLineSeries; }
            set { SetProperty(ref m_ReferenceLineSeries, value); }
        }
        public bool MFC7IsEnable
        {
            get { return m_MFC7IsEnable; }
            set { SetProperty(ref m_MFC7IsEnable, value); }
        }
        public bool MFC8IsEnable
        {
            get { return m_MFC8IsEnable; }
            set { SetProperty(ref m_MFC8IsEnable, value); }
        }
        public bool IsAutoMode
        {
            get { return m_IsAutoMode; }
            set { SetProperty(ref m_IsAutoMode, value); }
        }
        #endregion

        #region 命令
        private DelegateCommand _SelectGasCommand;
        public DelegateCommand SelectGasCommand =>
            _SelectGasCommand ?? (_SelectGasCommand = new DelegateCommand(OnSelectGas));

        private DelegateCommand _StartCommand;
        public DelegateCommand StartCommand =>
            _StartCommand ?? (_StartCommand = new DelegateCommand(OnStart));

        private DelegateCommand _LoadReferenceCommand;
        public DelegateCommand LoadReferenceCommand =>
            _LoadReferenceCommand ?? (_LoadReferenceCommand = new DelegateCommand(OnLoadReference));

        private DelegateCommand _AbortCommand;
        public DelegateCommand AbortCommand =>
            _AbortCommand ?? (_AbortCommand = new DelegateCommand(OnAbort));

        private DelegateCommand _SaveCommand;
        public DelegateCommand SaveCommand =>
            _SaveCommand ?? (_SaveCommand = new DelegateCommand(OnSave));
        #endregion

        #region 构造函数
        public VATPerformanceViewModel()
        {
            OnSelectGas();
            GasTime = 60;
            timer.Interval = TimeSpan.FromSeconds(2);
            timer.Tick += Timer_Tick;


        }
        #endregion

        #region 命令方法
        private void OnSelectGas()
        {
           var value=Convert.ToInt32( QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.MfcGas{(GasSelectedIndex+1).ToString()}.MfcN2Scale"));
           var xishu= Convert.ToDouble(QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.MfcGas{(GasSelectedIndex + 1).ToString()}.MfcScaleFactor"));
           GasFlow = (int)(value * xishu) / 2;
        }
        //public enum CMPressure
        //{
        //    CM1,
        //    CM2,
        //}
        //private CMPressure currentCMPressure = CMPressure.CM1;
        private void OnStart()
        {
            //currentCMPressure = CMPressure.CM1;
            m_VATPerformanceResult = new VATPerformanceResult();
            m_VATPerformanceResult.StartTime = DateTime.Now.ToString();
            m_VATPerformanceResult.FlowTime = GasTime;
            m_VATPerformanceResult.GasName = $"Gas{GasSelectedIndex+1}";
            CurrentLineSeries = new ChartValues<double>();
            timer.Start();
            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.VATPerformanceTest", GasSelectedIndex+1, 1000 * GasTime, GasFlow);
        }
        private void OnLoadReference()
        {
            //ReferenceLineSeries.Clear();
            //for (int i = 0; i < 21; i++)
            //{
            //    double value = Math.Round((double)GasFlow / (double)((i + 2) * 50),3);
            //    ReferenceLineSeries.Add(value);
            //}
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = ".json|*.json";
            dialog.InitialDirectory = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "VATPerformanceResult");
            if (dialog.ShowDialog() == true)
            {
                string SelectedPath = dialog.FileName;
                var value = SerializeHelper.Instance.ReadFromJsonFile<VATPerformanceResult>(SelectedPath);
                ReferenceLineSeries.Clear();
             
                value.ValuePairs.ForEach(x =>
                {              
                    ReferenceLineSeries.Add(x);
                });
            }
            else
            {
                ReferenceLineSeries.Clear();
                ReferenceLineSeries.Add(0);
            }
        }
        private void OnAbort()
        {
            timer.Stop();
            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
            CurrentLineSeries = new ChartValues<double>();
        }
        private void OnSave()
        {
            SerializeHelper.Instance.WriteToJsonFile<VATPerformanceResult>(m_VATPerformanceResult, $"VATPerformanceResult/{m_VATPerformanceResult.GasName}/{DateTime.Now.ToString("yyyyMMddHHmm")}.json");
        }
        #endregion
       
        #region 私有方法
        private  void Timer_Tick(object sender, EventArgs e)
        {
            CurrentLineSeries.Clear();

            var values = QueryDataClient.Instance.Service.GetData($"{ModuleName}.VATPerformanceResult").ToString();
            values.Split(',').ToList().ForEach(x => 
            {
                if (x != "")
                {
                    CurrentLineSeries.Add(Math.Round( Convert.ToDouble(x),3));
                }
            });

            if (CurrentLineSeries.Count == 20)
            {
                timer.Stop();
            }
            MFC7IsEnable = (bool)QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.MfcGas7.Enable");
            MFC8IsEnable = (bool)QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.MfcGas8.Enable");
            IsAutoMode = (bool)QueryDataClient.Instance.Service.GetData($"{ModuleName}.IsOnline");
        }
        #endregion
    }
}