using System;
using System.Collections.Generic;
using System.Runtime.Remoting.Lifetime;
using System.ServiceModel;
using Newtonsoft.Json;
using SSWMS.Common;

namespace SSWMS.Server
{
    [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single,
        ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = int.MaxValue, UseSynchronizationContext = false)]
    public class S_StorageService : I_StorageService
    {
        public GOODS_MAIN GetGoodsMain(int iGoodsID)
        {
            return S_BaseService._P_GOODS_MAIN.GetModel(iGoodsID);
        }

        public GOODS_MAIN GetGoodsMainByGoodsCode(string sGoodsCode)
        {
            return S_BaseService._P_GOODS_MAIN.GetModelByGoodsCode(sGoodsCode);
        }

        public string GetStockBarcode(string sCellCode)
        {
            STORAGE_MAIN sm = S_BaseService._P_STORAGE_MAIN.GetModelByCellCode(sCellCode);
            return sm == null ? string.Empty : sm.STOCK_BARCODE;
        }

        public IList<STORAGE_LIST> GetStorageList(string sStockBarcode)
        {
            return S_BaseService._P_STORAGE_LIST.GetListByStockBarcode(sStockBarcode);
        }

        public bool DeleteStorage(int iStorageID, int iStorageListID, string sOperator, out string sResult)
        {
            bool bResult = true;
            sResult = string.Empty;
            try
            {
                S_BaseService._P_Base_House.BeginTransaction();
                STORAGE_MAIN sm = S_BaseService._P_STORAGE_MAIN.GetModel(iStorageID);
                IList<STORAGE_LIST> lStorageList = S_BaseService._P_STORAGE_LIST.GetListByStorageID(iStorageID);
                if (sm == null || lStorageList == null || lStorageList.Count == 0)
                {
                    S_BaseService._P_Base_House.RollBackTransaction();
                    sResult = "未找到库存";
                    return false;
                }
                if (S_BaseService._P_MANAGE_MAIN.GetModelByStockBarcode(sm.STOCK_BARCODE) != null)
                {
                    S_BaseService._P_Base_House.RollBackTransaction();
                    sResult = string.Format("托盘条码 {0} 存在任务", sm.STOCK_BARCODE);
                    return false;
                }
                string sCurrentTime = StringUtils.GetCurrentTime();
                if (lStorageList.Count == 1)
                {
                    S_BaseService._P_STORAGE_MAIN.Delete(iStorageID);
                    S_BaseService._P_STORAGE_LIST.DeleteByStorageID(iStorageID);
                }
                else
                {
                    S_BaseService._P_STORAGE_LIST.Delete(iStorageListID);
                    sm.UPDATE_TIME = sCurrentTime;
                    S_BaseService._P_STORAGE_MAIN.Update(sm);
                }
                S_BaseService._P_SYS_LOG.Add(new SYS_LOG()
                {
                    OPERATOR = sOperator,
                    LOG_TYPE = "库存删除",
                    LOG_TIME = sCurrentTime,
                    LOG_TEXT = string.Format("托盘条码 {0} 货位编码 {1} 操作人员 {2}",
                        sm.STOCK_BARCODE, sm.CELL_CODE, sOperator)
                });
                S_BaseService._P_Base_House.CommitTransaction();
            }
            catch (Exception ex)
            {
                S_BaseService._P_Base_House.RollBackTransaction();
                bResult = false;
                sResult = ex.Message;
            }
            return bResult;
        }

        public bool StorageUpdate(List<STORAGE_LIST> lStorageList, string sOperator, out string sResult)
        {
            bool bResult = true;
            sResult = string.Empty;
            try
            {
                S_BaseService._P_Base_House.BeginTransaction();
                string sCurrentTime = StringUtils.GetCurrentTime();
                Dictionary<int, STORAGE_MAIN> dStorageBase = new Dictionary<int, STORAGE_MAIN>();
                foreach (STORAGE_LIST sl in lStorageList)
                {
                    STORAGE_LIST slBase = S_BaseService._P_STORAGE_LIST.GetModel(sl.STORAGE_LIST_ID);
                    if (slBase != null)
                    {
                        slBase.BOX_BARCODE = sl.BOX_BARCODE;
                        slBase.GOODS_BARCODE = sl.GOODS_BARCODE;
                        slBase.STORAGE_PROPERTY_01 = sl.STORAGE_PROPERTY_01;
                        slBase.STORAGE_PROPERTY_02 = sl.STORAGE_PROPERTY_02;
                        slBase.STORAGE_PROPERTY_03 = sl.STORAGE_PROPERTY_03;
                        slBase.STORAGE_PROPERTY_04 = sl.STORAGE_PROPERTY_04;
                        slBase.STORAGE_PROPERTY_05 = sl.STORAGE_PROPERTY_05;
                        slBase.STORAGE_PROPERTY_06 = sl.STORAGE_PROPERTY_06;
                        slBase.STORAGE_PROPERTY_07 = sl.STORAGE_PROPERTY_07;
                        slBase.STORAGE_PROPERTY_08 = sl.STORAGE_PROPERTY_08;
                        slBase.STORAGE_PROPERTY_09 = sl.STORAGE_PROPERTY_09;
                        slBase.STORAGE_PROPERTY_10 = sl.STORAGE_PROPERTY_10;
                        slBase.STORAGE_PROPERTY_11 = sl.STORAGE_PROPERTY_11;
                        slBase.STORAGE_PROPERTY_12 = sl.STORAGE_PROPERTY_12;
                        slBase.STORAGE_LIST_QUANTITY = sl.STORAGE_LIST_QUANTITY;
                        S_BaseService._P_STORAGE_LIST.Update(slBase);
                        if (!dStorageBase.ContainsKey(slBase.STORAGE_ID))
                        {
                            STORAGE_MAIN smBase = S_BaseService._P_STORAGE_MAIN.GetModel(slBase.STORAGE_ID);
                            if (smBase != null)
                            {
                                dStorageBase.Add(slBase.STORAGE_ID, smBase);
                            }
                        }
                    }
                }
                foreach (STORAGE_MAIN smBase in dStorageBase.Values)
                {
                    this.UpdateStorageProperty(smBase);
                    smBase.UPDATE_TIME = sCurrentTime;
                    S_BaseService._P_STORAGE_MAIN.Update(smBase);
                    S_BaseService._P_SYS_LOG.Add(new SYS_LOG()
                    {
                        LOG_TYPE = "库存更新",
                        LOG_TEXT = $"托盘条码 {smBase.STOCK_BARCODE}",
                        OPERATOR = sOperator,
                        LOG_TIME = sCurrentTime,
                    });
                }
                S_BaseService._P_Base_House.CommitTransaction();
            }
            catch (Exception ex)
            {
                S_BaseService._P_Base_House.RollBackTransaction();
                sResult = ex.Message;
                bResult = false;
            }
            return bResult;
        }

        public void UpdateStorageProperty(STORAGE_MAIN sm, IList<STORAGE_LIST> lStorageList = null)
        {
            if (lStorageList == null)
            {
                lStorageList = S_BaseService._P_STORAGE_LIST.GetListByStorageID(sm.STORAGE_ID);
            }
            if (lStorageList.Count == 0)
            {
                sm.GOODS_ID = SystemCode.GOODS_ID.MultiGoods;
                sm.STORAGE_PROPERTY = string.Empty;
                return;
            }
            sm.GOODS_ID = -1;
            foreach (STORAGE_LIST sl in lStorageList)
            {
                if (sm.GOODS_ID < 0)
                {
                    sm.GOODS_ID = sl.GOODS_ID;
                    sm.STORAGE_PROPERTY = sl.STORAGE_PROPERTY_01.ToString();
                }
                else if (sm.GOODS_ID != sl.GOODS_ID)
                {
                    sm.GOODS_ID = SystemCode.GOODS_ID.MultiGoods;
                    sm.STORAGE_PROPERTY = string.Empty;
                    return;
                }
            }
        }

        public bool EditStorage(STORAGE_MAIN sm, IList<STORAGE_LIST> lStorageList,
            string sOperator, out string sResult)
        {
            bool bResult = true;
            sResult = string.Empty;
            //try
            //{
            //    S_BaseService._P_Base_House.BeginTransaction();
            //    if (!this.UpdateStorage(sm, lStorageList, false, sOperator, out sResult))
            //    {
            //        S_BaseService._P_Base_House.RollBackTransaction();
            //        return false;
            //    }
            //    S_BaseService._P_Base_House.CommitTransaction();
            //}
            //catch (Exception ex)
            //{
            //    S_BaseService._P_Base_House.RollBackTransaction();
            //    sResult = ex.Message;
            //    bResult = false;
            //}
            return bResult;
        }

        public List<STORAGE_LIST> GetStorageListERP(string sStockBarcode, out string sResult)
        {
            if (StringUtils.StockBarcodeValidate(sStockBarcode))
            {
                return S_BaseService._S_ERPService.ERPGetBarCode(sStockBarcode, out sResult);
            }
            else
            {
                StockBarcodeData data = JsonConvert.DeserializeObject<StockBarcodeData>(sStockBarcode);
                if (data != null && StringUtils.StockBarcodeValidate(data.salverNumver))
                {
                    return S_BaseService._S_ERPService.ERPGetBarCode(sStockBarcode, out sResult);
                }
                else
                {
                    sResult = $"物料条码 {sStockBarcode} 格式错误";
                }
            }
            return null;
        }

        public bool StorageUpdateERP(List<string> lGoodsBarcode, out string sResult)
        {
            bool bResult = true;
            sResult = string.Empty;
            try
            {
                string sSingleResult = string.Empty;
                List<STORAGE_LIST> lStorageList = new List<STORAGE_LIST>();
                foreach (string sGoodsBarcode in lGoodsBarcode)
                {
                    List<STORAGE_LIST> lStorageListNew = S_BaseService._S_ERPService.ERPGetBarCode(sGoodsBarcode, out sSingleResult);
                    if (lStorageListNew == null)
                    {
                        bResult = false;
                        sResult += $"物料条码 {sGoodsBarcode} {sSingleResult}\n";
                    }
                    else
                    {
                        foreach (STORAGE_LIST slNew in lStorageListNew)
                        {
                            STORAGE_LIST slOld = S_BaseService._P_STORAGE_LIST.GetModelByGoodsBarcode(slNew.GOODS_BARCODE);
                            if (slOld == null)
                            {
                                bResult = false;
                                sResult += $"物料条码 {sGoodsBarcode} 未找到库存\n";
                                continue;
                            }
                            if (slOld.STORAGE_PROPERTY_01 == slNew.STORAGE_PROPERTY_01 &&
                                slOld.STORAGE_PROPERTY_02 == slNew.STORAGE_PROPERTY_02 &&
                                slOld.STORAGE_PROPERTY_03 == slNew.STORAGE_PROPERTY_03 &&
                                slOld.STORAGE_PROPERTY_04 == slNew.STORAGE_PROPERTY_04 &&
                                slOld.STORAGE_PROPERTY_05 == slNew.STORAGE_PROPERTY_05 &&
                                slOld.STORAGE_PROPERTY_06 == slNew.STORAGE_PROPERTY_06 &&
                                slOld.STORAGE_PROPERTY_07 == slNew.STORAGE_PROPERTY_07 &&
                                slOld.STORAGE_PROPERTY_08 == slNew.STORAGE_PROPERTY_08 &&
                                slOld.STORAGE_PROPERTY_09 == slNew.STORAGE_PROPERTY_09 &&
                                slOld.STORAGE_PROPERTY_10 == slNew.STORAGE_PROPERTY_10 &&
                                slOld.STORAGE_PROPERTY_11 == slNew.STORAGE_PROPERTY_11 &&
                                slOld.STORAGE_PROPERTY_12 == slNew.STORAGE_PROPERTY_12)
                            {
                                sResult += $"物料条码 {sGoodsBarcode} 更新成功\n";
                            }
                            else
                            {
                                slOld.STORAGE_PROPERTY_01 = slNew.STORAGE_PROPERTY_01;
                                slOld.STORAGE_PROPERTY_02 = slNew.STORAGE_PROPERTY_02;
                                slOld.STORAGE_PROPERTY_03 = slNew.STORAGE_PROPERTY_03;
                                slOld.STORAGE_PROPERTY_04 = slNew.STORAGE_PROPERTY_04;
                                slOld.STORAGE_PROPERTY_05 = slNew.STORAGE_PROPERTY_05;
                                slOld.STORAGE_PROPERTY_06 = slNew.STORAGE_PROPERTY_06;
                                slOld.STORAGE_PROPERTY_07 = slNew.STORAGE_PROPERTY_07;
                                slOld.STORAGE_PROPERTY_08 = slNew.STORAGE_PROPERTY_08;
                                slOld.STORAGE_PROPERTY_09 = slNew.STORAGE_PROPERTY_09;
                                slOld.STORAGE_PROPERTY_10 = slNew.STORAGE_PROPERTY_10;
                                slOld.STORAGE_PROPERTY_11 = slNew.STORAGE_PROPERTY_11;
                                slOld.STORAGE_PROPERTY_12 = slNew.STORAGE_PROPERTY_12;
                                lStorageList.Add(slOld);
                            }
                        }
                    }
                }
                if (lStorageList.Count > 0)
                {
                    try
                    {
                        S_BaseService._P_Base_House.BeginTransaction();
                        foreach (STORAGE_LIST sl in lStorageList)
                        {
                            S_BaseService._P_STORAGE_LIST.Update(sl);
                            sResult += $"物料条码 {sl.GOODS_BARCODE} 更新成功\n";
                        }
                        S_BaseService._P_Base_House.CommitTransaction();
                    }
                    catch (Exception ex)
                    {
                        S_BaseService._P_Base_House.RollBackTransaction();
                        bResult = false;
                        sResult += $"{ex.Message}\n";
                    }
                }
            }
            catch (Exception ex)
            {
                bResult = false;
                sResult += $"{ex.Message}\n";
            }
            sResult.TrimEnd('\n');
            return bResult;
        }
    }
}