using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.Util;
using MECF.Framework.Common.Beckhoff.ModuleIO;
using MECF.Framework.Common.CommonData.Prewet;
using MECF.Framework.Common.CommonData.Vpw;
using MECF.Framework.Common.IOCore;
using MECF.Framework.Common.Persistent.SRD;
using PunkHPX8_RT.Devices.AXIS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace PunkHPX8_RT.Devices.VpwCell
{
    public class VpwCellDevice : BaseDevice, IDevice
    {
        #region 常量 
        private const string COMMON_DATA = "CommonData";
        private const string DIW_FLOW = "DiwFlow";
        private const string VACUUM_PRESSURE = "VacuumPressure";
        private const string FLOW_DRIP = "FlowDrip";
        private const string FLOW_SMALL = "FlowSmall";
        private const string FLOW_LARGE = "FlowLarge";
        private const string VACUUM_VALVE = "VacuumValve";
        private const string VENT_VALVE = "VentValve";
        private const string DIW_DRAIN = "DiwDrain";
        #endregion
        #region 内部变量
        /// 
        /// 变量是否初始化字典
        /// 
        private Dictionary _variableInitializeDic = new Dictionary();
        /// 
        /// 数据
        /// 
        private VpwCellCommonData _commonData=new VpwCellCommonData();
        /// 
        /// 水平电机
        /// 
        private JetAxisBase _rotationAxis;
        #endregion
        #region 属性
        /// 
        /// 数据
        /// 
        public VpwCellCommonData CommonData { get { return _commonData; } }
        #endregion
        /// 
        /// 构造函数
        /// 
        /// 
        public VpwCellDevice(string moduleName) : base(moduleName, moduleName, moduleName, moduleName)
        {
        }
        #region 初始化
        /// 
        /// 初始化
        /// 
        /// 
        public bool Initialize()
        {
            InitializeParameter();
            InitializeRoutine();
            SubscribeData();
            SubscribeValueAction();
            InitializeOperation();
            return true;
        }
        /// 
        /// 初始化参数
        /// 
        private void InitializeParameter()
        {
            _rotationAxis = DEVICE.GetDevice($"{Module}.Rotation");
        }
        /// 
        /// 初始化Routine
        /// 
        private void InitializeRoutine()
        {
        }
        /// 
        /// 订阅
        /// 
        private void SubscribeData()
        {
            DATA.Subscribe($"{Module}.{COMMON_DATA}", () => CommonData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
        }
        /// 
        /// 订阅数据
        /// 
        private void SubscribeValueAction()
        {
            IoSubscribeUpdateVariable(DIW_FLOW);
            IoSubscribeUpdateVariable(DIW_DRAIN);
            IoSubscribeUpdateVariable(VACUUM_PRESSURE);
            IoSubscribeUpdateVariable(VACUUM_VALVE);
            IoSubscribeUpdateVariable(VENT_VALVE);
            IoSubscribeUpdateVariable(FLOW_DRIP);
            IoSubscribeUpdateVariable(FLOW_LARGE);
            IoSubscribeUpdateVariable(FLOW_SMALL);
        }
        /// 
        /// 初始化变量
        /// 
        /// 
        private void IoSubscribeUpdateVariable(string variable)
        {
            _variableInitializeDic[variable] = false;
            IOModuleManager.Instance.SubscribeModuleVariable(Module, variable, UpdateVariableValue);
        }
        /// 
        /// 更新变量数值
        /// 
        /// 
        /// 
        private void UpdateVariableValue(string variable, object value)
        {
            PropertyInfo property = _commonData.GetType().GetProperty(variable);
            if (property != null)
            {
                property.SetValue(_commonData, value);
            }
            if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable])
            {
                _variableInitializeDic[variable] = true;
            }
        }
        /// 
        /// 初始化OP
        /// 
        private void InitializeOperation()
        {
            OP.Subscribe($"{Module}.FlowDripOn", (cmd,para)=> { return FlowDripOn(); });
            OP.Subscribe($"{Module}.FlowDripOff", (cmd, para) => { return FlowDripOff(); });
            OP.Subscribe($"{Module}.FlowSmallOn", (cmd, para) => { return FlowSmallOn(); });
            OP.Subscribe($"{Module}.FlowSmallOff", (cmd, para) => { return FlowSmallOff(); });
            OP.Subscribe($"{Module}.FlowLargeOn", (cmd, para) => { return FlowLargeOn(); });
            OP.Subscribe($"{Module}.FlowLargeOff", (cmd, para) => { return FlowLargeOff(); });
            OP.Subscribe($"{Module}.VentValveOn", (cmd, para) => { return VentValveOn(); });
            OP.Subscribe($"{Module}.VentValveOff", (cmd, para) => { return VentValveOff(); });
            OP.Subscribe($"{Module}.DrainValveOn", (cmd, para) => { return DrainValveOn(); });
            OP.Subscribe($"{Module}.DrainValveOff", (cmd, para) => { return DrainValveOff(); });
            OP.Subscribe($"{Module}.VacuumValveOn", (cmd, para) => { return VacuumValveOn(); });
            OP.Subscribe($"{Module}.VacuumValveOff", (cmd, para) => { return VacuumValveOff(); });
        }
        #endregion
        #region Action
        #region Flow
        /// 
        /// Flow Drip on
        /// 
        /// 
        public bool FlowDripOn()
        {
            return WriteVariableValue(FLOW_DRIP, true);
        }
        /// 
        /// Flow Drip Off
        /// 
        /// 
        public bool FlowDripOff()
        {
            return WriteVariableValue(FLOW_DRIP, false);
        }
        /// 
        /// Flow Small On
        /// 
        /// 
        public bool FlowSmallOn()
        {
            return WriteVariableValue(FLOW_SMALL, true);
        }
        /// 
        /// Flow Small Off
        /// 
        /// 
        public bool FlowSmallOff()
        {
            return WriteVariableValue(FLOW_SMALL, false);
        }
        /// 
        /// Flow Large On
        /// 
        /// 
        public bool FlowLargeOn()
        {
            return WriteVariableValue(FLOW_LARGE, true);
        }
        /// 
        /// Flow Large Off
        /// 
        /// 
        public bool FlowLargeOff()
        {
            return WriteVariableValue(FLOW_LARGE, false);
        }
        #endregion
        /// 
        /// Vent Valve On
        /// 
        /// 
        private bool VentValveOn()
        {
            return WriteVariableValue(VENT_VALVE, true);
        }
        /// 
        /// Vent Valve Off
        /// 
        /// 
        private bool VentValveOff()
        {
            return WriteVariableValue(VENT_VALVE, false);
        }
        /// 
        /// Vent Valve On
        /// 
        /// 
        private bool DrainValveOn()
        {
            return WriteVariableValue(DIW_DRAIN, true);
        }
        /// 
        /// Vent Valve Off
        /// 
        /// 
        private bool DrainValveOff()
        {
            return WriteVariableValue(DIW_DRAIN, false);
        }
        /// 
        /// Vacuum valve on
        /// 
        /// 
        private bool VacuumValveOn()
        {
            return WriteVariableValue(VACUUM_VALVE, true);
        }
        /// 
        /// Vacuum valve off
        /// 
        /// 
        private bool VacuumValveOff()
        {
            return WriteVariableValue(VACUUM_VALVE, false);
        }
        /// 
        /// 写变量
        /// 
        /// 
        /// 
        /// 
        private bool WriteVariableValue(string variable, object value)
        {
            string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variable}");
            return IOModuleManager.Instance.WriteIoValue(ioName, value);
        }
        #endregion
        /// 
        /// 定时器
        /// 
        /// 
        public bool OnTimer()
        {
            if (_rotationAxis != null)
            {
                _rotationAxis.OnTimer();
            }
            return true;
        }
        /// 
        /// 监控
        /// 
        public void Monitor()
        {
        }
        public void Reset()
        {
        }
        public void Terminate()
        {
        }
    }
}