using System;
using QMAPP.FJC.TRACING.DAInterface;
using QMAPP.FJC.Entity.QT;
using System.Data;
using QMAPP.FJC.DAL.CheckTime;

namespace QMAPP.FJC.TRACING.DataValidators
{
    /// <summary>
    /// 前置工序时间校验
    /// </summary>
    public class TimeValidator : IDataValidator
    {
        public ValidateResult Validate(DAObject data,DAIValidation validOption)
        {
            CHECKTIMEDAL dal = new CHECKTIMEDAL();
            var timeCheck = dal.GetTimeCheckCfg(data.WorkLocState.WORKLOC_CODE, data.DAI.DA_CODE);
            //T_MD_PRODUCT_TIMECHECK timeCheck = LocSwitchDataAccess.GetTimeCheckCfg(data.WorkLocState.WORKCELL_CODE, data.DAI.DA_CODE);
            if(timeCheck == null) return new ValidateResult(true, "");
            DataTable checkTable = dal.GetConfigValue(timeCheck, data.DAValue.ToString());
            if (checkTable == null || checkTable.Rows.Count == 0)
            {
                return new ValidateResult(true, "");
            }

            DataRow dataRow = checkTable.Rows[0];

            var ispass = TimeOutCompare(dataRow["CheckColumnValue"].ToString(), timeCheck.Operator, timeCheck.Check_Value, timeCheck.Check_ValueTo, timeCheck.Check_Type);

            if(ispass) return new ValidateResult(true, "");
            else return new ValidateResult(false, "未达到时间验证标准!");
           
        }

        /// <summary>
        /// 比较字符串相等
        /// </summary>
        /// <param name="pCheckColumnValue"></param>
        /// <param name="pOperator"></param>
        /// <param name="pCheck_Value"></param>
        /// <returns></returns>
        public static bool StringEqual(string pCheckColumnValue, string pOperator, string pCheck_Value)
        {
            return pCheckColumnValue == pCheck_Value;
        }

        /// <summary>
        /// 比较时间是否满足条码
        /// </summary>
        /// <param name="pCheckColumnValue">校验字段配置的值</param>
        /// <param name="pOperator">操作符</param>
        /// <param name="pCheck_Value">验证值</param>
        /// <returns></returns>
        public static bool TimeOutCompare(string pCheckColumnValue, string pOperator, string pCheck_Value, string pCheck_ValueTo, string pCheck_Type)
        {
            CHECKTIMEDAL dal = new CHECKTIMEDAL();
            var preStatTime = DateTime.Now;
            if (!DateTime.TryParse(pCheckColumnValue, out preStatTime))
            {
                throw new Exception("检测值CheckColumnValue必须是DateTime类型");
            }
            int len = 0;
            if (!int.TryParse(pCheck_Value, out len))
            {
                throw new Exception("验证值Check_Value必须是int类型");
            }

            int len2 = 0;
            if (!string.IsNullOrEmpty(pCheck_ValueTo))
            {
                if (!int.TryParse(pCheck_ValueTo, out len2))
                {
                    throw new Exception("验证值pCheck_ValueTo必须是int类型");
                }
            }

            DateTime serviceTime = dal.GetServiceDateTime();
            TimeSpan ts = serviceTime.Subtract(preStatTime);
            if (pCheck_Type == "1")
            {
                switch (pOperator)
                {
                    case ">": return ts.TotalSeconds > len;
                    case "<": return ts.TotalSeconds < len;
                    case "=": return ts.TotalSeconds == len;
                    case ">=": return ts.TotalSeconds >= len;
                    case "<=": return ts.TotalSeconds <= len;
                }
            }
            else if (pCheck_Type == "2")
            {
                return pCheckColumnValue == pCheck_Value;
            }
            else if (pCheck_Type == "3")
            {
                if (ts.TotalSeconds > len && ts.TotalSeconds < len2) return true;
                else return false;
            }
            return true;
        }

    }
}