using Aitex.Core.Common;
using Aitex.Core.UI.MVVM;
using Aitex.Core.Util;
using Aitex.Core.Utilities;
using LiveCharts;
using MECF.Framework.Common.Beckhoff.AxisProvider;
using MECF.Framework.Common.Beckhoff.Station;
using MECF.Framework.Common.CommonData.PUF;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.Common.Utilities;
using CyberX8_MainPages.Unity;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Input;
using System.Windows.Threading;
namespace CyberX8_MainPages.ViewModels
{
    public class TransporterMotionViewModel : BindableBase
    {
        #region 常量 
        private const string MOTION_DATA = "MotionData";
        #endregion
        #region 内部变量
        /// 
        /// 增加
        /// 
        private double _incrementValue = 0.01;
        /// 
        /// RT查询key集合
        /// 
        private List _rtDataKeys = new List();
        /// 
        /// rt查询key数值字典
        /// 
        private Dictionary _rtDataValueDic = new Dictionary();
        /// 
        /// 定时器
        /// 
        private DispatcherTimer _timer;
        #region Transporter2 Gantry
        /// 
        /// Transporter 2 Gantry moduleName
        /// 
        private string _transporter2GantryModuleName;
        /// 
        /// SwingA数据
        /// 
        private CommandMotionData _transporter2GantryMotionData;
        #endregion
        #region Transporter2 Elevator
        /// 
        /// Transporter2 Elevator moduleName
        /// 
        private string _transporter2ElevatorModuleName;
        /// 
        /// Transporter2 Elevator 数据
        /// 
        private CommandMotionData _transporter2ElevatorMotionData;
        #endregion
        #region Transporter1 Gantry
        /// 
        /// Transporter1 Gantry moduleName
        /// 
        private string _transporter1GantryModuleName;
        /// 
        /// Transporter1 Gantry数据
        /// 
        private CommandMotionData _transporter1GantryMotionData;
        #endregion
        #region Transporter1  Elevator
        /// 
        /// Transporter1 Elevator moduleName
        /// 
        private string _transporter1ElevatorModuleName;
        /// 
        /// TiltB数据
        /// 
        private CommandMotionData _transporter1ElevatorMotionData;
        #endregion
        #endregion
        #region 属性
        /// 
        /// 步进
        /// 
        public double IncrementValue
        {
            get { return _incrementValue; }
            set { SetProperty(ref _incrementValue, value); }
        }
        #region Transporter2 Gantry
        /// 
        /// Transporter2 Gantry ModuleName
        /// 
        public string Transporter2GantryModuleName { get { return _transporter2GantryModuleName; } set { SetProperty(ref _transporter2GantryModuleName, value); } }
        /// 
        /// Transporter2 Gantry 数据
        /// 
        public CommandMotionData Transporter2GantryMotionData { get { return _transporter2GantryMotionData; } set { SetProperty(ref _transporter2GantryMotionData, value); } }
        #endregion
        #region Transporter2 Elevator
        /// 
        /// Transporter2 Elevator ModuleName
        /// 
        public string Transporter2ElevatorModuleName { get { return _transporter2ElevatorModuleName; } set { SetProperty(ref _transporter2ElevatorModuleName, value); } }
        /// 
        /// Transporter2 Elevator 数据
        /// 
        public CommandMotionData Transporter2ElevatorMotionData { get { return _transporter2ElevatorMotionData; } set { SetProperty(ref _transporter2ElevatorMotionData, value); } }
        #endregion
        #region Transporter1 Gantry
        /// 
        /// Transporter1 Gantry ModuleName
        /// 
        public string Transporter1GantryModuleName { get { return _transporter1GantryModuleName; } set { SetProperty(ref _transporter1GantryModuleName, value); } }
        /// 
        /// Transporter1 Gantry 数据
        /// 
        public CommandMotionData Transporter1GantryMotionData { get { return _transporter1GantryMotionData; } set { SetProperty(ref _transporter1GantryMotionData, value); } }
        #endregion
        #region Transporter1 Elevator
        /// 
        /// Transporter1 Elevator ModuleName
        /// 
        public string Transporter1ElevatorModuleName { get { return _transporter1ElevatorModuleName; } set { SetProperty(ref _transporter1ElevatorModuleName, value); } }
        /// 
        /// TiltB 数据
        /// 
        public CommandMotionData Transporter1ElevatorMotionData { get { return _transporter1ElevatorMotionData; } set { SetProperty(ref _transporter1ElevatorMotionData, value); } }
        #endregion
        #endregion
        /// 
        /// 构造函数
        /// 
        public TransporterMotionViewModel()
        {
        }
        /// 
        /// 加载数据
        /// 
        public void LoadData(string systemName)
        {
            Transporter2GantryModuleName = $"{ModuleName.Transporter2}.Gantry";
            Transporter2ElevatorModuleName = $"{ModuleName.Transporter2}.Elevator";
            Transporter1GantryModuleName = $"{ModuleName.Transporter1}.Gantry";
            Transporter1ElevatorModuleName = $"{ModuleName.Transporter1}.Elevator";
            _rtDataKeys.Clear();
            _rtDataKeys.Add($"{Transporter2GantryModuleName}.IsHomed");
            _rtDataKeys.Add($"{Transporter2GantryModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{Transporter2GantryModuleName}.{MOTION_DATA}");
            _rtDataKeys.Add($"{Transporter2ElevatorModuleName}.IsHomed");
            _rtDataKeys.Add($"{Transporter2ElevatorModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{Transporter2ElevatorModuleName}.{MOTION_DATA}");
            _rtDataKeys.Add($"{Transporter1GantryModuleName}.IsHomed");
            _rtDataKeys.Add($"{Transporter1GantryModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{Transporter1GantryModuleName}.{MOTION_DATA}");
            _rtDataKeys.Add($"{Transporter1ElevatorModuleName}.IsHomed");
            _rtDataKeys.Add($"{Transporter1ElevatorModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{Transporter1ElevatorModuleName}.{MOTION_DATA}"); 
            if (_timer == null)
            {
                _timer = new DispatcherTimer();
                _timer.Interval = TimeSpan.FromMilliseconds(200);
                _timer.Tick += Timer_Tick;
            }
            _timer.Start();
        }
        /// 
        /// 定时器执行
        /// 
        /// 
        /// 
        private void Timer_Tick(object sender, EventArgs e)
        {
            if (_rtDataKeys.Count != 0)
            {
                _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
                if (_rtDataValueDic != null)
                {
                    Transporter2GantryMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{Transporter2GantryModuleName}.{MOTION_DATA}");
                    Transporter2ElevatorMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{Transporter2ElevatorModuleName}.{MOTION_DATA}");
                    Transporter1GantryMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{Transporter1GantryModuleName}.{MOTION_DATA}");
                    Transporter1ElevatorMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{Transporter1ElevatorModuleName}.{MOTION_DATA}");
                }
            }
        }
        /// 
        /// 隐藏
        /// 
        public void Hide()
        {
            if (_timer != null)
            {
                _timer.Stop();
            }
        }
    }
}