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.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 LoaderMotionViewModel : BindableBase
    {

        #region 常量 

        private const string MOTION_DATA = "MotionData";
        #endregion

        #region 内部变量

        /// <summary>
        /// 模块名称
        /// </summary>
        private string _module = "";
        /// <summary>
        /// 增加
        /// </summary>
        private double _incrementValue = 0.01;
        /// <summary>
        /// 定时器
        /// </summary>
        private DispatcherTimer _timer;
        /// <summary>
        /// RT查询key集合
        /// </summary>
        private List<string> _rtDataKeys = new List<string>();
        /// <summary>
        /// rt查询key数值字典
        /// </summary>
        private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();

        #region ShuttleA
        /// <summary>
        /// shuttleA moduleName
        /// </summary>
        private string _shuttleAModuleName;

        /// <summary>
        /// shuttleA数据
        /// </summary>
        private CommandMotionData _shuttleAMotionData;
        #endregion

        #region shuttleB
        /// <summary>
        /// shuttleB moduleName
        /// </summary>
        private string _shuttleBModuleName;
        /// <summary>
        /// shuttleB数据
        /// </summary>
        private CommandMotionData _shuttleBMotionData;
        #endregion

        #region TiltA
        /// <summary>
        /// TiltA moduleName
        /// </summary>
        private string _tiltAModuleName;
        /// <summary>
        /// TiltA数据
        /// </summary>
        private CommandMotionData _tiltAMotionData;
        #endregion

        #region TiltB
        /// <summary>
        /// tiltB moduleName
        /// </summary>
        private string _tiltBModuleName;
        /// <summary>
        /// TiltB数据
        /// </summary>
        private CommandMotionData _tiltBMotionData;
        #endregion

        #region CRSA
        /// <summary>
        /// CRSA moduleName
        /// </summary>
        private string _crsAModuleName;
        /// <summary>
        /// CRSA数据
        /// </summary>
        private CommandMotionData _crsAMotionData;
        #endregion

        #region CRSB
        /// <summary>
        /// crsB moduleName
        /// </summary>
        private string _crsBModuleName;
        /// <summary>
        /// CRSB数据
        /// </summary>
        private CommandMotionData _crsBMotionData;
        #endregion

        #region Rotation
        /// <summary>
        /// Rotation moduleName
        /// </summary>
        private string _rotationModuleName;
        /// <summary>
        /// Rotation数据
        /// </summary>
        private CommandMotionData _rotationMotionData;
        #endregion

        #endregion

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

        /// <summary>
        /// 步进
        /// </summary>
        public double IncrementValue
        {
            get { return _incrementValue; }
            set { SetProperty(ref _incrementValue, value); }
        }

        #region shuttleA
        /// <summary>
        /// shuttleA ModuleName
        /// </summary>
        public string ShuttleAModuleName { get { return _shuttleAModuleName; } set { SetProperty(ref _shuttleAModuleName, value); } }
        /// <summary>
        /// shuttleA 数据
        /// </summary>
        public CommandMotionData ShuttleAMotionData { get { return _shuttleAMotionData; } set { SetProperty(ref _shuttleAMotionData, value); } }
        #endregion

        #region shuttleB
        /// <summary>
        /// shuttleB ModuleName
        /// </summary>
        public string ShuttleBModuleName { get { return _shuttleBModuleName; } set { SetProperty(ref _shuttleBModuleName, value); } }
        /// <summary>
        /// shuttleB 数据
        /// </summary>
        public CommandMotionData ShuttleBMotionData { get { return _shuttleBMotionData; } set { SetProperty(ref _shuttleBMotionData, value); } }
        #endregion

        #region TiltA
        /// <summary>
        /// TiltA ModuleName
        /// </summary>
        public string TiltAModuleName { get { return _tiltAModuleName; } set { SetProperty(ref _tiltAModuleName, value); } }

        /// <summary>
        /// TiltA 数据
        /// </summary>
        public CommandMotionData TiltAMotionData { get { return _tiltAMotionData; } set { SetProperty(ref _tiltAMotionData, value); } }
        #endregion

        #region TiltB
        /// <summary>
        /// TiltB ModuleName
        /// </summary>
        public string TiltBModuleName { get { return _tiltBModuleName; } set { SetProperty(ref _tiltBModuleName, value); } }
        /// <summary>
        /// TiltB 数据
        /// </summary>
        public CommandMotionData TiltBMotionData { get { return _tiltBMotionData; } set { SetProperty(ref _tiltBMotionData, value); } }
        #endregion

        #region CRSA
        /// <summary>
        /// CRSA ModuleName
        /// </summary>
        public string CRSAModuleName { get { return _crsAModuleName; } set { SetProperty(ref _crsAModuleName, value); } }

        /// <summary>
        /// CRSA 数据
        /// </summary>
        public CommandMotionData CRSAMotionData { get { return _crsAMotionData; } set { SetProperty(ref _crsAMotionData, value); } }
        #endregion

        #region CRSB
        /// <summary>
        /// CRSB ModuleName
        /// </summary>
        public string CRSBModuleName { get { return _crsBModuleName; } set { SetProperty(ref _crsBModuleName, value); } }

        /// <summary>
        /// CRSB 数据
        /// </summary>
        public CommandMotionData CRSBMotionData { get { return _crsBMotionData; } set { SetProperty(ref _crsBMotionData, value); } }
        #endregion

        #region Rotation
        /// <summary>
        /// Rotation ModuleName
        /// </summary>
        public string RotationModuleName { get { return _rotationModuleName; } set { SetProperty(ref _rotationModuleName, value); } }

        /// <summary>
        /// Rotation 数据
        /// </summary>
        public CommandMotionData RotationMotionData { get { return _rotationMotionData; } set { SetProperty(ref _rotationMotionData, value); } } 
        #endregion

        #endregion

        /// <summary>
        /// 构造函数
        /// </summary>
        public LoaderMotionViewModel()
        {
        }
        /// <summary>
        /// 加载数据
        /// </summary>
        public void LoadData(string systemName)
        {
            Module = systemName;
            ShuttleAModuleName = $"{Module}.ShuttleA";
            ShuttleBModuleName = $"{Module}.ShuttleB";
            TiltAModuleName = $"{Module}.TiltA";
            TiltBModuleName = $"{Module}.TiltB";
            CRSAModuleName = $"{Module}.LSA";
            CRSBModuleName = $"{Module}.LSB";
            RotationModuleName = $"{Module}.Rotation";

            _rtDataKeys.Clear();
            _rtDataKeys.Add($"{ShuttleAModuleName}.IsHomed");
            _rtDataKeys.Add($"{ShuttleAModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{ShuttleAModuleName}.{MOTION_DATA}");

            _rtDataKeys.Add($"{ShuttleBModuleName}.IsHomed");
            _rtDataKeys.Add($"{ShuttleBModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{ShuttleBModuleName}.{MOTION_DATA}");

            _rtDataKeys.Add($"{TiltAModuleName}.IsHomed");
            _rtDataKeys.Add($"{TiltAModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{TiltAModuleName}.{MOTION_DATA}");

            _rtDataKeys.Add($"{TiltBModuleName}.IsHomed");
            _rtDataKeys.Add($"{TiltBModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{TiltBModuleName}.{MOTION_DATA}");

            _rtDataKeys.Add($"{CRSAModuleName}.IsHomed");
            _rtDataKeys.Add($"{CRSAModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{CRSAModuleName}.{MOTION_DATA}");

            _rtDataKeys.Add($"{CRSBModuleName}.IsHomed");
            _rtDataKeys.Add($"{CRSBModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{CRSBModuleName}.{MOTION_DATA}");

            _rtDataKeys.Add($"{RotationModuleName}.IsHomed");
            _rtDataKeys.Add($"{RotationModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{RotationModuleName}.{MOTION_DATA}");
            if (_timer == null)
            {
                _timer = new DispatcherTimer();
                _timer.Interval = TimeSpan.FromMilliseconds(100);
                _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)
            {
                _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
                if (_rtDataValueDic != null)
                {
                    ShuttleAMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{ShuttleAModuleName}.{MOTION_DATA}");

                    ShuttleBMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{ShuttleBModuleName}.{MOTION_DATA}");

                    TiltAMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{TiltAModuleName}.{MOTION_DATA}");

                    TiltBMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{TiltBModuleName}.{MOTION_DATA}");

                    CRSAMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{CRSAModuleName}.{MOTION_DATA}");

                    CRSBMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{CRSBModuleName}.{MOTION_DATA}");

                    RotationMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{RotationModuleName}.{MOTION_DATA}");
                }
            }
        }

        /// <summary>
        /// 隐藏
        /// </summary>
        public void Hide()
        {
            if (_timer != null)
            {
                _timer.Stop();
            }
        }
    }
}