using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using com.hnshituo.core.webapp.vo;

namespace MeterConditionLibrary
{
    public class validPrediction
    {
        /// <summary>
        /// 验证预报信息，在扫码的时候验证
        /// </summary>
        /// <param name="scale">预报信息</param>
        public bool ValidMethod(PreTrackScale scale,out string ResultMessage) 
        {
            bool flag = false;
            ResultMessage = "";
            //若预报是批次预报PREDICTION_TYPE 0：批次预报；1：单次预报；2：联运预报；3：分检预报，需验证预报类型USED_TYPE  0：次数；1：时间；2：总量
            //一次计量类型为次数时，验证EFFECTIVE_NUM-METER_NUM>0，服务端每结净一次++METER_NUM  
            //一次计量类型为时间时，验证当前时间在EFFECTIVE_START_TIME、EFFECTIVE_END_TIME范围内即可
            //一次计量类型为总量时，验证EFFECTIVE_WEIGHT-METER_WEIGHT>0，服务端每次结净一次METER_WEIGHT+净重

            //一次计量时若预报是分检预报，验证EFFECTIVE_NUM-METER_NUM>0，服务端每结净一次++METER_NUM
            //一次计量时不是批次预报，则只要有效即可

            PreTrackScaleService mwmss = new PreTrackScaleService();
            RESTfulResult<List<PreTrackScale>> rm = mwmss.doQueryWf(new PreTrackScale { predictionNo = scale.predictionNo });
            if (!rm.Succeed)
            {
                ResultMessage = "未找到有效预报!";
                PbCache.ResultMessage = "获取预报信息异常：" + rm.ResultMessage;
            }
            else 
            {
                if (rm.Data == null || rm.Data.Count == 0)
                {
                    ResultMessage = "【"+ scale.predictionNo + "】未找到有效预报";
                }
                else 
                {
                    switch (rm.Data[0].valueFlag) 
                    {
                        case "0": //未配车
                            ResultMessage = "【" + scale.predictionNo + "】,未找到有效预报，请先进行配车操作！";
                            break;
                        case "1": //未使用，说明是一次计量
                            {
                                if (rm.Data[0].predictionType == "0") //0：批次预报
                                {
                                    if (rm.Data[0].usedType == "0") //0：次数；
                                    {
                                        if (rm.Data[0].effectiveNum - rm.Data[0].meterNum > 0)
                                        {
                                            flag = true;
                                        }
                                        else
                                        {
                                            ResultMessage = "计量预报已经使用";//该预报检斤次数已用完，无法继续使用
                                            PbCache.ResultMessage = "预报【" + scale.predictionNo + "】检斤次数已用完，无法继续使用";
                                        }
                                    }
                                    else if (rm.Data[0].usedType == "1") //1：时间；
                                    {
                                        if (rm.Data[0].effectiveStartTime <= DateTime.Now && DateTime.Now <= rm.Data[0].effectiveEndTime)
                                        {
                                            flag = true;
                                        }
                                        else
                                        {
                                            ResultMessage = "计量预报已经过期";
                                            PbCache.ResultMessage = "计量预报【" + scale.predictionNo + "】已经过期";
                                        }
                                    }
                                    else if (rm.Data[0].usedType == "2") //2：总量
                                    {
                                        if (rm.Data[0].effectiveWeight > rm.Data[0].meterWeight)
                                        {
                                            flag = true;
                                        }
                                        else
                                        {
                                            ResultMessage = "计量预报已经使用";//
                                            PbCache.ResultMessage = "预报【" + scale.predictionNo + "】有效重量已用完，无法继续使用";
                                        }
                                    }
                                }
                                else if (rm.Data[0].predictionType == "1" || rm.Data[0].predictionType == "2") //1：单次预报；2：联运预报
                                {
                                    flag = true;
                                }
                                else if (rm.Data[0].predictionType == "3") //3：分检预报
                                {
                                    if (rm.Data[0].effectiveNum - rm.Data[0].meterNum > 0) 
                                    {
                                        flag = true;
                                    }
                                    else 
                                    {
                                        ResultMessage = "计量预报已经使用";//该预报检斤次数已用完，无法继续使用
                                        PbCache.ResultMessage = "预报检斤【" + scale.predictionNo + "】次数已用完，无法继续使用";
                                    }
                                }
                                else 
                                {
                                    ResultMessage = "未找到有效预报";
                                    PbCache.ResultMessage = string.Format("没有预报类型为【{0}】的逻辑", rm.Data[0].predictionType);
                                }
                            }; 
                            break;
                        case "2": 
                            ResultMessage = "计量预报已经使用";//
                            PbCache.ResultMessage = "计量预报【" + scale.predictionNo + "】已经使用";
                            //flag = true;
                            break;
                        case "3":
                            ResultMessage = "计量预报已经过期";
                            PbCache.ResultMessage = "该预报【" + scale.predictionNo + "】已作废";
                            break;
                        case "4": //正使用  //已使用，则不验证，因为一次计量的时候会验证一次
                            flag = true;
                            //ResultMessage = "计量预报已经使用";//
                            //PbCache.ResultMessage = "计量预报已经使用";
                            break;
                    }
                }
            }

            return flag;
        }
    }
}
