using Aitex.Core.UI.MVVM;
using Aitex.Core.Util;
using Aitex.Core.Utilities;
using ExcelLibrary.BinaryFileFormat;
using MECF.Framework.Common.Beckhoff.AxisProvider;
using MECF.Framework.Common.Beckhoff.IOAxis;
using MECF.Framework.Common.CommonData.PUF;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.Common.Utilities;
using CyberX8_Core;
using CyberX8_MainPages.Model;
using CyberX8_MainPages.Unity;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Input;
using System.Windows.Threading;

namespace CyberX8_MainPages.ViewModels
{
    public class PufMotionViewModel : BindableBase
    {
        #region 常量
        private const string MOTION_DATA = "MotionData";
        #endregion

        #region 内部变量

        #region flip
        /// <summary>
        /// flip模块名称
        /// </summary>
        private string _flipModuleName;
        /// <summary>
        /// 数据
        /// </summary>
        private CommandMotionData _flipMotionData;
        #endregion

        #region rotation
        /// <summary>
        /// rotation模块名称
        /// </summary>
        private string _rotationModuleName;
        /// <summary>
        /// 
        /// </summary>
        private CommandMotionData _rotationMotionData;
        #endregion

        /// <summary>
        /// 模块名称
        /// </summary>
        private string _module = "";
        /// <summary>
        /// 增加
        /// </summary>
        private double _incrementValue = 0.01;
        /// <summary>
        /// 
        /// </summary>
        private PufDistanceData _distanceData;

        /// <summary>
        /// 定时器
        /// </summary>
        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>();
        #endregion

        #region 属性
        #region Flip
        /// <summary>
        /// Filp名称
        /// </summary>
        public string FlipModuleName
        {
            get { return _flipModuleName; }
            set { SetProperty(ref _flipModuleName, value); }
        }
        /// <summary>
        /// 
        /// </summary>
        public CommandMotionData FlipMotionData
        {
            get { return _flipMotionData; }
            set { SetProperty(ref _flipMotionData, value); }
        }
        #endregion

        #region Rotation
        /// <summary>
        /// Rotate名称
        /// </summary>
        public string RotationModuleName
        {
            get { return _rotationModuleName; }
            set { SetProperty(ref _rotationModuleName, value); }
        }
        public CommandMotionData RotationMotionData
        {
            get { return _rotationMotionData; }
            set { SetProperty(ref _rotationMotionData, value); }
        }
        #endregion

        /// <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); }
        }

        public PufDistanceData DistanceData
        {
            get { return _distanceData; }
            set { SetProperty(ref _distanceData, value); }
        }
        #endregion

        /// <summary>
        /// 构造函数
        /// </summary>
        public PufMotionViewModel()
        {
            IncrementValue = (double)QueryDataClient.Instance.Service.GetConfig("System.Increment");
            FlipMotionData = new CommandMotionData();
            RotationMotionData = new CommandMotionData();
        }
        /// <summary>
        /// 加载数据
        /// </summary>
        public void LoadData(string systemName)
        {
            Module = systemName;
            FlipModuleName = $"{Module}.Flip";
            RotationModuleName = $"{Module}.Rotation";
            _rtDataKeys.Clear();
            _rtDataKeys.Add($"{FlipModuleName}.IsHomed");
            _rtDataKeys.Add($"{FlipModuleName}.IsSwitchOn");
            _rtDataKeys.Add($"{FlipModuleName}.{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)
                {
                    FlipMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{FlipModuleName}.{MOTION_DATA}");

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

                }
            }
        }

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