using MESClassLibrary.BLL.Log;
using MESClassLibrary.DAL.ZPPlan;
using MESClassLibrary.EFModel;
using MESClassLibrary.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;

namespace MESClassLibrary.BLL.BasicInfo
{
    public class ZPPlanBLL
    {
        readonly BasicBLL<tb_ZPPlan> db = new BasicBLL<tb_ZPPlan>();

        /// <summary>
        /// 新增信息
        /// </summary>
        /// <param name="md"></param>
        /// <returns></returns>
        public bool AddInfo(tb_ZPPlan md)
        {
            try
            {
                var now = DateTime.Now;
                md.ID = Guid.NewGuid().ToString();
                md.CreateTime = now;
                md.OrderNo = now.ToString("yyyyMMdd");
                md.IsFinish = 0;
                md.ProductCount = 0;
                md.BadCount = 0;
                md.Item = GetItem(md.OrderNo);
                var result = db.AddInfo(md);
                return result;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }
        }

        private int GetItem(string orderNo)
        {
            var lastItem = db.Search(q => q.OrderNo == orderNo, q => q.CreateTime).LastOrDefault();
            return lastItem == null ? 1 : (lastItem.Item.Value + 1);
        }

        /// <summary>
        /// 修改信息
        /// </summary>
        /// <param name="md"></param>
        /// <returns></returns>
        public bool UpdateInfo(tb_ZPPlan md, ref string msg)
        {
            try
            {
                var data = db.SearchInfoByID(md.ID);
                if (data.IsFinish == 3)
                {
                    msg = "该计划已经完成";
                    return false;
                }
                if (data.ProductCount.GetValueOrDefault(0).CompareTo(md.OrderCount) > 0)
                {
                    msg = "计划数量不能小于完成数量";
                    return false;
                }
                if (data.ProductCount.GetValueOrDefault(0) == 0)
                {
                    //data.StationID = md.StationID;
                    data.PartNo = md.PartNo;
                    data.OrderDate = md.OrderDate;
                }

                //data.IsOneMore = md.IsOneMore;
                data.OrderCount = md.OrderCount;
                return db.UpdateInfo(data);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                msg = ex.ToString();
                return false;
            }

        }

        /// <summary>
        /// 删除信息
        /// </summary>
        /// <param name="md"></param>
        /// <param name="flag"></param>
        /// <returns></returns>
        public bool DeleteInfo(tb_ZPPlan md)
        {
            try
            {
                return db.DelInfo(md);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }

        }

        /// <summary>
        /// 查询全部信息分页
        /// </summary>
        /// <returns></returns>
        public string SearchInfoAll(int page,
                                    int pagesize,
                                    string startTime,
                                    string endTime,
                                    string partNo)
        {
            try
            {
                string jsonStr = "[]";
                int total = 0;//总行数
                IEnumerable<tb_ZPPlan> list = SearchDB(startTime, endTime, partNo);
                if (list.Any())
                {
                    List<ZPPlanModel> modelList = new List<ZPPlanModel>();
                    total = list.Count();
                    int Skipcount = (Convert.ToInt32(page) - 1) * Convert.ToInt32(pagesize);
                    list = list.Skip(Skipcount).Take(Convert.ToInt32(pagesize));

                    ProductBLL prodBll = new ProductBLL();
                    var prodList = prodBll.SearchAll();
                    //StationBLL stationBll = new StationBLL();
                    //var stationList = stationBll.SearchAll();

                    foreach (var item in list)
                    {
                        var prodInfo = prodList.Where(q => q.PartNo == item.PartNo).FirstOrDefault();
                        //var stationInfo = stationList.Where(q => q.StationID == item.StationID).FirstOrDefault();

                        ZPPlanModel zpm = Tool.Mapper<ZPPlanModel, tb_ZPPlan>(item);
                        //zpm.StationNo = stationInfo == null ? "" : stationInfo.StationNo;
                        zpm.ProductName = prodInfo == null ? "" : prodInfo.ProductName;

                        modelList.Add(zpm);
                    }

                    JsonDataModel<ZPPlanModel> md = new JsonDataModel<ZPPlanModel>
                    {
                        total = total.ToString(),
                        rows = modelList
                    };
                    jsonStr = md.ToSerializer();
                }

                return jsonStr;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public List<ZPPlanModel> SearchByCreateTime(string startTime, string endTime, string partNo)
        {
            IEnumerable<tb_ZPPlan> list = SearchDB(startTime, endTime, partNo);
            List<ZPPlanModel> modelList = new List<ZPPlanModel>();
            if (list.Any())
            {
                ProductBLL prodBll = new ProductBLL();
                var prodList = prodBll.SearchAll();
                StationBLL stationBll = new StationBLL();
                var stationList = stationBll.SearchAll();

                foreach (var item in list)
                {
                    var prodInfo = prodList.Where(q => q.PartNo == item.PartNo).FirstOrDefault();
                    //var stationInfo = stationList.Where(q => q.StationID == item.StationID).FirstOrDefault();

                    ZPPlanModel zpm = Tool.Mapper<ZPPlanModel, tb_ZPPlan>(item);
                    //zpm.StationNo = stationInfo == null ? "" : stationInfo.StationNo;
                    zpm.ProductName = prodInfo == null ? "" : prodInfo.ProductName;

                    modelList.Add(zpm);
                }
            }
            return modelList;
        }

        public IEnumerable<tb_ZPPlan> SearchDB(string startTime, string endTime, string partNo)
        {
            DateTime st, et;
            if (!DateTime.TryParse(startTime, out st)) st = DateTime.MinValue;
            if (!DateTime.TryParse(endTime, out et)) et = DateTime.MaxValue;

            IEnumerable<tb_ZPPlan> list;
            if (string.IsNullOrEmpty(partNo))
            {
                list = db.Search(
                   q => (q.CreateTime >= st &&
                         q.CreateTime <= et) &&
                         q.IsFinish != 3,
                   q => q.CreateTime);
            }
            else
            {
                list = db.Search(q => q.PartNo != null && q.PartNo.Contains(partNo) && q.IsFinish == 0, q => q.CreateTime);
            }
            return list;
        }

        /// <summary>
        /// 查询全部信息
        /// </summary>
        /// <returns></returns>
        public List<tb_ZPPlan> SearchAll()
        {
            try
            {
                var s_list = db.SearchAllInfo();
                return s_list;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        /// <summary>
        /// 根据ID查询信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public tb_ZPPlan SearchInfoByID(string id)
        {
            try
            {
                return db.SearchInfoByID(id);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }

        }

        public DataTable GetProductingPlan(string station)
        {
            try
            {
                ZPPlanDAL dal=new ZPPlanDAL();

                return dal.GetProductingPlan(station);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public DataTable GetProductingPlan1(string station,string orderNo)
        {
            try
            {
                ZPPlanDAL dal = new ZPPlanDAL();

                return dal.GetProductingPlan1(station,orderNo);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public DataTable GetPlan(string station, int flag, string planTime)
        {
            try
            {
                ZPPlanDAL dal = new ZPPlanDAL();

                return dal.GetPlan(station, flag,planTime);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public bool updateQty(ZPPlanModel md)
        {
            try
            {
                ZPPlanDAL dal = new ZPPlanDAL();

                return dal.updateQty(md);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }
        }

        public bool updateBad(ZPPlanModel md)
        {
            try
            {
                ZPPlanDAL dal = new ZPPlanDAL();

                return dal.updateBad(md);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }
        }

        public DataTable SearchPlanInfo(string planID)
        {
            try
            {
                ZPPlanDAL dal = new ZPPlanDAL();

                return dal.SearchPlanInfo(planID);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public DataTable SearchOrderNo(string orderno)
        {
            try
            {
                ZPPlanDAL dal = new ZPPlanDAL();

                return dal.SearchOrderNo(orderno);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(),MethodBase.GetCurrentMethod());
                return null;
            }
        }
    }
}