using Aitex.Core.RT.ConfigCenter;
using Aitex.Core.Util;
using MECF.Framework.Common.CommonData.PowerSupplier;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.Device.LinMot;
using MECF.Framework.Common.Device.PowerSupplier;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Utilities;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;

namespace CyberX8_MainPages.ViewModels
{
    public class PowerSupplierViewModel : BindableBase
    {
        #region 常量 
        private const string POWERSUPPLIER_DATA = "PowerSupplierData";
        private const string CONNECTED = "Connected";
        #endregion

        #region 内部变量
        /// <summary>
        /// 模块名称
        /// </summary>
        private string _module;
        /// <summary>
        /// 查询后台数据集合
        /// </summary>
        private List<string> _rtDataKeys = new List<string>();
        /// <summary>
        /// 查询后台的数据
        /// </summary>
        private Dictionary<string, object> _rtDataValues;
        /// <summary>
        /// 定时器
        /// </summary>
        private DispatcherTimer _timer;

        #region SideA
        /// <summary>
        /// SideA PowerSupplier
        /// </summary>
        private string _sideAPowerSupplier;
        /// <summary>
        /// SideA PowerSupplier数据
        /// </summary>
        private PowerSupplierData _sideAPowerSupplierData;
        /// <summary>
        /// SideA PowerSupplier连接状态
        /// </summary>
        private bool _sideAPowerSupplierConnected;
        /// <summary>
        /// SideA 步阶1数据
        /// </summary>
        private PowerSupplierStepPeriodData _sideAStep1Data = new PowerSupplierStepPeriodData();
        /// <summary>
        /// SideA 步阶2数据
        /// </summary>
        private PowerSupplierStepPeriodData _sideAStep2Data = new PowerSupplierStepPeriodData();
        /// <summary>
        /// SideA 步阶3数据
        /// </summary>
        private PowerSupplierStepPeriodData _sideAStep3Data = new PowerSupplierStepPeriodData();
        #endregion

        #region SideB
        /// <summary>
        /// SideA PowerSupplier
        /// </summary>
        private string _sideBPowerSupplier;
        /// <summary>
        /// SideB PowerSupplier数据
        /// </summary>
        private PowerSupplierData _sideBPowerSupplierData;
        /// <summary>
        /// SideB PowerSupplier连接状态
        /// </summary>
        private bool _sideBPowerSupplierConnected;
        /// <summary>
        /// SideB 步阶1数据
        /// </summary>
        private PowerSupplierStepPeriodData _sideBStep1Data = new PowerSupplierStepPeriodData();
        /// <summary>
        /// SideB 步阶2数据
        /// </summary>
        private PowerSupplierStepPeriodData _sideBStep2Data = new PowerSupplierStepPeriodData();
        /// <summary>
        /// SideB 步阶3数据
        /// </summary>
        private PowerSupplierStepPeriodData _sideBStep3Data = new PowerSupplierStepPeriodData();
        #endregion

        #endregion
        #region 属性
        /// <summary>
        /// 模块名称
        /// </summary>
        public string Module { get { return _module; } set { SetProperty(ref _module, value); } }

        #region SideA
        /// <summary>
        /// SideA PowerSupplier
        /// </summary>
        public string SideAPowerSupplier
        {
            get { return _sideAPowerSupplier; }
            set { SetProperty(ref _sideAPowerSupplier, value); }
        }
        /// <summary>
        /// SideA PowerSupplier 数据
        /// </summary>
        public PowerSupplierData SideAPowerSupplierData
        {
            get { return _sideAPowerSupplierData; }
            set { SetProperty(ref _sideAPowerSupplierData, value);}
        }
        /// <summary>
        /// SideA PowerSupplier连接状态
        /// </summary>
        public bool SideAPowerSupplierConnected
        {
            get { return _sideAPowerSupplierConnected; }
            set { SetProperty(ref _sideAPowerSupplierConnected, value); }
        }
        /// <summary>
        /// SideA 步阶1数据
        /// </summary>
        public PowerSupplierStepPeriodData SideAStep1Data
        {
            get { return _sideAStep1Data; }
            set { SetProperty(ref _sideAStep1Data, value); }
        }
        /// <summary>
        /// SideA 步阶2数据
        /// </summary>
        public PowerSupplierStepPeriodData SideAStep2Data
        {
            get { return _sideAStep2Data; }
            set { SetProperty(ref _sideAStep2Data, value); }
        }
        /// <summary>
        /// SideA 步阶3数据
        /// </summary>
        public PowerSupplierStepPeriodData SideAStep3Data
        {
            get { return _sideAStep3Data; }
            set { SetProperty(ref _sideAStep3Data, value); }
        }
        #endregion

        #region SideB
        /// <summary>
        /// SideB PowerSupplier
        /// </summary>
        public string SideBPowerSupplier
        {
            get { return _sideBPowerSupplier; }
            set { SetProperty(ref _sideBPowerSupplier, value); }
        }
        /// <summary>
        /// SideB PowerSupplier 数据
        /// </summary>
        public PowerSupplierData SideBPowerSupplierData
        {
            get { return _sideBPowerSupplierData; }
            set { SetProperty(ref _sideBPowerSupplierData, value); }
        }
        /// <summary>
        /// SideB PowerSupplier连接状态
        /// </summary>
        public bool SideBPowerSupplierConnected
        {
            get { return _sideBPowerSupplierConnected; }
            set { SetProperty(ref _sideBPowerSupplierConnected, value); }
        }

        /// <summary>
        /// SideB 步阶1数据
        /// </summary>
        public PowerSupplierStepPeriodData SideBStep1Data
        {
            get { return _sideBStep1Data; }
            set { SetProperty(ref _sideBStep1Data, value); }
        }
        /// <summary>
        /// SideA 步阶2数据
        /// </summary>
        public PowerSupplierStepPeriodData SideBStep2Data
        {
            get { return _sideBStep2Data; }
            set { SetProperty(ref _sideBStep2Data, value); }
        }
        /// <summary>
        /// SideA 步阶3数据
        /// </summary>
        public PowerSupplierStepPeriodData SideBStep3Data
        {
            get { return _sideBStep3Data; }
            set { SetProperty(ref _sideBStep3Data, value); }
        }
        #endregion

        #endregion

        /// <summary>
        /// 构造函数
        /// </summary>
        public PowerSupplierViewModel()
        {
        }
        /// <summary>
        /// 加载数据
        /// </summary>
        public void LoadData(string systemName)
        {
            Module = systemName;
            List<string> lst = new List<string>();
            lst.Add($"{Module}.SideA.PowerSupplier");
            lst.Add($"{Module}.SideB.PowerSupplier");
            _rtDataValues = QueryDataClient.Instance.Service.PollData(lst);
            if (_rtDataValues != null)
            {
                SideAPowerSupplier = CommonFunction.GetValue<string>(_rtDataValues, $"{Module}.SideA.PowerSupplier");
                SideBPowerSupplier = CommonFunction.GetValue<string>(_rtDataValues, $"{Module}.SideB.PowerSupplier");
            }
            InitiRtDataKeys();
            if(_timer==null)
            {
                _timer = new DispatcherTimer();
                _timer.Interval = TimeSpan.FromMilliseconds(500);
                _timer.Tick += Timer_Tick;
            }
            _timer.Start();
        }
        /// <summary>
        /// 定时器执行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Tick(object sender, EventArgs e)
        {
            if (_rtDataKeys.Count != 0)
            {
                _rtDataValues = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
                if (_rtDataValues != null)
                {
                    SideAPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValues, $"{_sideAPowerSupplier}.{POWERSUPPLIER_DATA}");
                    SideBPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValues, $"{_sideBPowerSupplier}.{POWERSUPPLIER_DATA}");
                    SideAPowerSupplierConnected = CommonFunction.GetValue<bool>(_rtDataValues, $"{_sideAPowerSupplier}.{CONNECTED}");
                    SideBPowerSupplierConnected = CommonFunction.GetValue<bool>(_rtDataValues, $"{_sideBPowerSupplier}.{CONNECTED}");
                }
            }
        }

        /// <summary>
        /// 隐藏
        /// </summary>
        public void Hide()
        {
            if (_timer != null)
            {
                _timer.Stop();
            }
        }
        /// <summary>
        /// 初始化查询Key
        /// </summary>
        private void InitiRtDataKeys()
        {
            _rtDataKeys.Clear();
            if(SideAPowerSupplier!=null)
            {
                _rtDataKeys.Add($"{_sideAPowerSupplier}.{POWERSUPPLIER_DATA}");
                _rtDataKeys.Add($"{_sideAPowerSupplier}.{CONNECTED}");
            }
            if (SideBPowerSupplier != null)
            {
                _rtDataKeys.Add($"{_sideBPowerSupplier}.{POWERSUPPLIER_DATA}");
                _rtDataKeys.Add($"{_sideBPowerSupplier}.{CONNECTED}");
            }
        }

    }
}