using Aitex.Core.RT.DataCenter;
using Aitex.Core.UI.MVVM;
using Aitex.Core.Util;
using Aitex.Core.Utilities;
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 PunkHPX8_Core;
using PunkHPX8_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 PunkHPX8_MainPages.ViewModels
{
    public class PufServiceScreenViewModel : BindableBase
    {
        #region 常量 
        private const string MOTOR_POSITION = "MotorPosition";
        private const string CHUCKA_VAC = "ChuckAVac";
        private const string CHUCKB_VAC = "ChuckBVac";
        private const string CHUCKA_RELEASE = "ChuckARelease";
        private const string CHUCKB_RELEASE = "ChuckBRelease";
        private const string DISTANCE_OFFSET1 = "DistanceOffset1";
        private const string DISTANCE_OFFSET2 = "DistanceOffset2";
        private const string DISTANCE_SENSOR1 = "DistanceSensor1";
        private const string DISTANCE_SENSOR2 = "DistanceSensor2";
        private const string CURRENT_STATION = "CurrentStation";
        private const string CHUCKA_VACUUM_STATUS = "ChuckAVacuumStatus";
        private const string CHUCKB_VACUUM_STATUS = "ChuckBVacuumStaus";
        private const string IS_SWITCH_ON = "IsSwitchOn";
        private const string CHUCK = "Chuck";
        private const string SIDEA_CHUCK_OUT = "SideAChuckOut";
        private const string SIDEA_CHUCK_IN = "SideAChuckIn";
        private const string SIDEB_CHUCK_OUT = "SideBChuckOut";
        private const string SIDEB_CHUCK_IN = "SideBChuckIn";
        #endregion
        #region 内部变量 
        #region flip
        /// 
        /// flip模块名称
        /// 
        private string _flipModuleName;
        /// 
        /// flip当前位置
        /// 
        private double _flipMotorPosition ;
        /// 
        /// flip是否正在工作
        /// 
        private bool _flipIsMotorOn;
        /// 
        /// Flip当前Station
        /// 
        private string _flipCurrentStation;
        #endregion
        #region rotation
        /// 
        /// rotation模块名称
        /// 
        private string _rotationModuleName;
        /// 
        /// rotation当前位置
        /// 
        private double _rotationMotorPosition;
        /// 
        /// rotation是否正在工作
        /// 
        private bool _rotationIsMotorOn;
        /// 
        /// Rotation当前Station
        /// 
        private string _rotationCurrentStation;
        #endregion
        #region vacuum
        private bool _vacuumA;
        private double _vacuumAValue;
        private string _vacuumAStatus;
        private bool _vacuumB;
        private double _vacuumBValue;
        private string _vacuumBStatus;
        #endregion
        #region Chuck
        private bool _chuck;
        private bool _sideAChuckOut;
        private bool _sideBChuckOut;
        private bool _sideAChuckIn;
        private bool _sideBChuckIn;
        #endregion
        /// 
        /// 查询后台数据集合
        /// 
        private List _rtDataKeys = new List();
        /// 
        /// rt查询key数值字典
        /// 
        private Dictionary _rtDataValueDic = new Dictionary();
        /// 
        /// 模块名称
        /// 
        private string _moduleName = "";
        /// 
        /// 
        /// 
        private PufDistanceData _distanceData=new PufDistanceData();
        /// 
        /// 定时器
        /// 
        private DispatcherTimer _timer;
        #endregion
        #region 属性
        /// 
        /// 模块名称
        /// 
        public string ModuleName
        {
            get { return _moduleName; }
            set { SetProperty(ref _moduleName, value); }
        }
        #region Flip
        /// 
        /// Filp名称
        /// 
        public string FlipModuleName
        {
            get { return _flipModuleName; }
            set { SetProperty(ref _flipModuleName, value); }
        }
        public double FlipMotionPosition
        {
            get { return _flipMotorPosition; }
            set { SetProperty(ref _flipMotorPosition, value); }
        }
        public bool FlipIsMotorOn
        {
            get { return _flipIsMotorOn; }
            set { SetProperty(ref _flipIsMotorOn, value); }
        }
        /// 
        /// Flip当前位置
        /// 
        public string FlipCurrentStation
        {
            get { return _flipCurrentStation; }
            set { SetProperty(ref _flipCurrentStation, value);}
        }
        #endregion
        #region rotation
        /// 
        /// Filp名称
        /// 
        public string RotationModuleName
        {
            get { return _rotationModuleName; }
            set { SetProperty(ref _rotationModuleName, value); }
        }
        public double RotationMotionPosition
        {
            get { return _rotationMotorPosition; }
            set { SetProperty(ref _rotationMotorPosition, value); }
        }
        public bool RotationIsMotorOn
        {
            get { return _rotationIsMotorOn; }
            set { SetProperty(ref _rotationIsMotorOn, value); }
        }
        /// 
        /// Rotation当前位置
        /// 
        public string RotationCurrentStation
        {
            get { return _rotationCurrentStation; }
            set { SetProperty(ref _rotationCurrentStation, value); }
        }
        #endregion
        #region Vacuum
        /// 
        /// VacuumA
        /// 
        public bool VacuumA
        {
            get { return _vacuumA; }
            set { SetProperty(ref _vacuumA, value);}
        }
        /// 
        /// VacuumB
        /// 
        public bool VacuumB
        {
            get { return _vacuumB;}
            set { SetProperty(ref _vacuumB, value); }
        }
        /// 
        /// VacuumA数值
        /// 
        public double VacuumAValue
        {
            get { return _vacuumAValue; }
            set { SetProperty(ref _vacuumAValue, value); }
        }
        /// 
        /// VacuumA状态
        /// 
        public string VacuumAStatus
        {
            get { return _vacuumAStatus; }
            set { SetProperty(ref _vacuumAStatus, value); }
        }
        /// 
        /// VacuumB数值
        /// 
        public double VacuumBValue
        {
            get { return _vacuumBValue; }
            set
            {
                SetProperty(ref _vacuumBValue, value);
            }
        }
        /// 
        /// VacuumB状态
        /// 
        public string VacuumBStatus
        {
            get { return _vacuumBStatus; }
            set { SetProperty(ref _vacuumBStatus, value); }
        }
        public PufDistanceData DistanceData
        {
            get { return _distanceData; }
            set { SetProperty(ref _distanceData, value);}
        }
        #endregion
        #region Chuck
        public bool Chuck
        {
            get { return _chuck; }
            set { SetProperty(ref _chuck, value); }
        }
        public bool SideAChuckOut
        {
            get { return _sideAChuckOut; }
            set { SetProperty(ref _sideAChuckOut, value); }
        }
        public bool SideBChuckOut
        {
            get { return _sideBChuckOut; }
            set { SetProperty(ref _sideBChuckOut, value); }
        }
        public bool SideAChuckIn
        {
            get { return _sideAChuckIn; }
            set { SetProperty(ref _sideAChuckIn,value); }
        }
        public bool SideBChuckIn
        {
            get { return _sideBChuckIn; }
            set {SetProperty(ref _sideBChuckIn, value); }
        }
        #endregion
        #endregion
        /// 
        /// 构造函数
        /// 
        public PufServiceScreenViewModel()
        {
        }
        /// 
        /// 初始化查询数据集合
        /// 
        private void addDataKeys()
        {
            _rtDataKeys.Clear();
            _rtDataKeys.Add($"{FlipModuleName}.{MOTOR_POSITION}");
            _rtDataKeys.Add($"{FlipModuleName}.{IS_SWITCH_ON}");
            _rtDataKeys.Add($"{FlipModuleName}.{CURRENT_STATION}");
            _rtDataKeys.Add($"{RotationModuleName}.{MOTOR_POSITION}");
            _rtDataKeys.Add($"{RotationModuleName}.{IS_SWITCH_ON}");
            _rtDataKeys.Add($"{RotationModuleName}.{CURRENT_STATION}");
            _rtDataKeys.Add($"{ModuleName}.{CHUCKA_RELEASE}");
            _rtDataKeys.Add($"{ModuleName}.{CHUCKB_RELEASE}");
            _rtDataKeys.Add($"{ModuleName}.{CHUCKA_VAC}");
            _rtDataKeys.Add($"{ModuleName}.{CHUCKB_VAC}");
            _rtDataKeys.Add($"{ModuleName}.{CHUCK}");
            _rtDataKeys.Add($"{ModuleName}.{SIDEA_CHUCK_IN}");
            _rtDataKeys.Add($"{ModuleName}.{SIDEB_CHUCK_IN}");
            _rtDataKeys.Add($"{ModuleName}.{SIDEA_CHUCK_OUT}");
            _rtDataKeys.Add($"{ModuleName}.{SIDEB_CHUCK_OUT}");
            _rtDataKeys.Add($"{ModuleName}.{DISTANCE_OFFSET1}");
            _rtDataKeys.Add($"{ModuleName}.{DISTANCE_OFFSET2}");
            _rtDataKeys.Add($"{ModuleName}.{DISTANCE_SENSOR1}");
            _rtDataKeys.Add($"{ModuleName}.{DISTANCE_SENSOR2}");
            _rtDataKeys.Add($"{ModuleName}.{CHUCKA_VACUUM_STATUS}");
            _rtDataKeys.Add($"{ModuleName}.{CHUCKB_VACUUM_STATUS}");
        }
        /// 
        /// 加载数据
        /// 
        public void LoadData(string system)
        {
            ModuleName = system;
            FlipModuleName = $"{ModuleName}.Flip";
            RotationModuleName = $"{ModuleName}.Rotation";
            addDataKeys(); 
            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)
                {
                    FlipMotionPosition = CommonFunction.GetValue(_rtDataValueDic, $"{FlipModuleName}.{MOTOR_POSITION}");
                    FlipIsMotorOn = CommonFunction.GetValue(_rtDataValueDic, $"{FlipModuleName}.{IS_SWITCH_ON}");
                    FlipCurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{FlipModuleName}.{CURRENT_STATION}"), FlipModuleName);
                    RotationMotionPosition = CommonFunction.GetValue(_rtDataValueDic, $"{RotationModuleName}.{MOTOR_POSITION}");
                    RotationIsMotorOn = CommonFunction.GetValue(_rtDataValueDic, $"{RotationModuleName}.{IS_SWITCH_ON}");
                    RotationCurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{RotationModuleName}.{CURRENT_STATION}"), RotationModuleName);
                    VacuumA = !CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{CHUCKA_RELEASE}");
                    VacuumB = !CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{CHUCKB_RELEASE}");
                    VacuumAValue = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{CHUCKA_VAC}");
                    VacuumBValue = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{CHUCKB_VAC}");
                    VacuumAStatus = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{CHUCKA_VACUUM_STATUS}");
                    VacuumBStatus = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{CHUCKB_VACUUM_STATUS}");
                    DistanceData.Offset1 = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{DISTANCE_OFFSET1}");
                    DistanceData.Offset2 = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{DISTANCE_OFFSET2}");
                    DistanceData.Distance1 = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{DISTANCE_SENSOR1}");
                    DistanceData.Distance2 = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{DISTANCE_SENSOR2}");
                    Chuck = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{CHUCK}");
                    SideAChuckIn = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{SIDEA_CHUCK_IN}");
                    SideAChuckOut= CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{SIDEA_CHUCK_OUT}");
                    SideBChuckIn = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{SIDEB_CHUCK_IN}");
                    SideBChuckOut = CommonFunction.GetValue(_rtDataValueDic, $"{ModuleName}.{SIDEB_CHUCK_OUT}");
                }
            }
        }
        /// 
        /// 隐藏
        /// 
        public void Hide()
        {
            if (_timer != null)
            {
                _timer.Stop();
            }
        }
       
    }
}