using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QMAPP.FJC.TRACING.DAInterface;
using QMAPP.FJC.Entity.QT;
using QMAPP.MD.DAL;

namespace QMAPP.FJC.TRACING.DataValidators
{
    /// <summary>
    /// 采集点输入顺序校验
    /// </summary>
    public class DASequenceValidator:IDataValidator
    {
        public ValidateResult Validate1(DAObject data, DAIValidation validOption)
        {
            if (data.DAI.DA_SEQ <= 1) //第一个采集点无需验证
            {
                return new ValidateResult(true, "");
            }
            else
            {
                //查询前置采集点采集值为空的项
                var preDa = (from dai in data.WorkLocState.DataCache
                          where dai.DA_SEQ < data.DAI.DA_SEQ //采集顺序小于当前采集点 
                             && string.IsNullOrWhiteSpace(dai.DA_VALUE) //采集值为空
                             && !string.Equals(dai.DA_MODE,"2") //采集模式不是可忽略的
                          orderby dai.DA_SEQ descending
                          select dai).FirstOrDefault();
                if (preDa == null)
                {
                    return new ValidateResult(true, "");
                }
                else
                {
                    return new ValidateResult(
                        false,
                        string.Format("在输入“{0}”前应先输入“{1}”!",data.DAI.DA_NAME,preDa.DA_NAME));
                }
            }
        }
        public ValidateResult Validate(DAObject data, DAIValidation validOption)
        {
            if (data.DAI.DA_SEQ <= 1) //第一个采集点无需验证
            {
                return new ValidateResult(true, "");
            }
            else
            {
                //查询前置采集点采集值为空的项
                var preDa = (from dai in data.WorkLocState.DataCache
                             where dai.DA_SEQ < data.DAI.DA_SEQ //采集顺序小于当前采集点 
                                && string.IsNullOrWhiteSpace(dai.DA_VALUE) //采集值为空
                                //&& !string.Equals(dai.DA_MODE, "2") //采集模式不是可忽略的
                             //&& !string.Equals(dai.DA_MODE, "5") //采集模式不是可忽略的
                             orderby dai.DA_SEQ descending
                             select dai).ToList();
                if (preDa.Count < 1)
                {
                    return new ValidateResult(true, "");
                }
                else
                {
                    if (preDa.Exists(p => p.DA_MODE != "5"&&p.DA_MODE != "2"))
                    {
                        var req_da = preDa.FirstOrDefault(p => p.DA_MODE != "5" && p.DA_MODE != "2");
                        return new ValidateResult(
                        false,
                        string.Format("在输入“{0}”前应先输入“{1}”!", data.DAI.DA_NAME, req_da.DA_NAME));
                    }

                    //提取采集数据中的物料号信息
                    var materials = (from da in data.WorkLocState.DataCache
                                     where !string.IsNullOrWhiteSpace(da.MATERIAL_CODE)
                                           && !string.Equals(da.DA_MODE, "2") //过滤掉可省略的采集点
                                         //&& !string.Equals(da.DA_MODE, "3") //过滤掉自适应采集点
                                           && !string.Equals(da.DA_MODE, "5") //过滤掉自适应采集点
                                           && !string.Equals(da.DA_CODE, data.DAI.DA_CODE) //过滤掉当前输入的采集点
                                     select da.MATERIAL_CODE).ToList();
                    PbomDAL dal = new PbomDAL();
                    materials.Add(data.MaterialCode + "");
                    MD.Entity.View.BomLocation bomloc = null;
                    if (string.IsNullOrWhiteSpace(data.WorkLocState.CurrentState.MATERIAL_CODE))
                    {
                        var bomlocates = dal.LocateBom(materials.Distinct().ToArray()); //匹配物料BOM
                        if (bomlocates.Count > 0)
                        {
                            if (data.OrderPlan != null)
                            {
                                bomloc = bomlocates.FirstOrDefault(p => p.BOMCode == data.OrderPlan.PBOM_CODE);
                            }
                            else if (bomlocates.GroupBy(p => p.UP_MATERIAL_CODE).ToList().Count == 1)
                            {
                                bomloc = bomlocates[0];
                            }
                        }
                    }
                    else
                    {
                        var bomlocates = dal.LocateBomByUpMaterial(data.WorkLocState.CurrentState.MATERIAL_CODE);
                        if (bomlocates.Count > 0)
                        {
                            bomloc = bomlocates[0];
                        }
                    }
                    if (bomloc != null)
                    {
                        var bomitems = dal.GetBomItemsByLocateWithType(bomloc); //查找组成物料列表
                        foreach (var da in preDa.Where(p => p.DA_MODE == "5" || p.DA_MODE == "2"))
                        {
                            if (bomitems.Exists(p => p.MATERIAL_TYPE_CODE == da.MATERIAL_TYPE || p.UP_MATERIAL_TYPE_CODE == da.MATERIAL_TYPE))
                            {
                                return new ValidateResult(
                                    false,
                                    string.Format("请先输入“{1}”,当前生产产品“{1}”为必须项!", data.DAI.DA_NAME, da.DA_NAME));
                            }
                        }
                    }
                    return new ValidateResult(true, "");
                }
            }
        }
    }
}