using Aitex.Core.RT.Log;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace PunkHPX8_RT.Modules
{
    public class HoldoffTimeSignalMonitor
    {
        #region 内部变量
        /// 
        /// 初次检测到变量异常的时间
        /// 
        private DateTime _abnormalStartTime;
        /// 
        /// 变量信号是否异常
        /// 
        private bool _isInAbnormalState = false;
        /// 
        /// 模块名
        /// 
        private string _module;
        /// 
        /// 异常项名
        /// 
        private string _itemName;
        #endregion
        public HoldoffTimeSignalMonitor(string Muodule,string ItemName)
        {
            _module = Muodule;
            _itemName = ItemName;
        }
        /// 
        /// 判断信号是否超出holdofftime时间的异常
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public bool IsSignalAbnormal(double holdoffTime,double currentValue,double? maxLimit,double? minLimit)
        { 
            bool isAbnormal = false;
            if(CheckValueAbnormal(currentValue,maxLimit,minLimit)) //检测当前值是否异常
            {
                isAbnormal = true;
            }
            if(isAbnormal && !_isInAbnormalState)//首次检测到异常
            {
                LOG.WriteLog(eEvent.WARN_METAL, _module, $"{_module} {_itemName} is Abnormal,CurrentValue is :{currentValue}");
                _isInAbnormalState = true;
                _abnormalStartTime = DateTime.Now; 
            }
            if(!isAbnormal && _isInAbnormalState) // holdofftime时间内恢复
            {
                LOG.WriteLog(eEvent.INFO_METAL, _module, $"{_module} {_itemName} is restore");
                _isInAbnormalState = false;
            }
            if((DateTime.Now - _abnormalStartTime).TotalSeconds > holdoffTime && _isInAbnormalState)//异常时间超过holdofftime
            {
                //_isInAbnormalState = false;//报错前把状态清掉,防止人工处理正常后该值一直为true
                return true;
            }
            return false;
        }
        private bool CheckValueAbnormal(double currentValue, double? maxLimit, double? minLimit)
        {
            if(maxLimit!=null && minLimit != null)
            {
                if(currentValue >= maxLimit || currentValue <= minLimit)
                {
                    return true ;
                } 
            }
            else if(maxLimit!=null && minLimit == null)
            {
                if (currentValue >= maxLimit)
                {
                    return true;
                }
            }
            else if(maxLimit == null && minLimit != null)
            {
                if (currentValue <= minLimit)
                {
                    return true;
                }
            }
            return false;
        }
    }
}