using Admin.Core.IService;
using Admin.Core.Model;
using Aucma.Scada.UI.ViewModel;
using log4net;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Aucma.Scada.UI
{
    /// <summary>
    /// 实时库存业务逻辑
    /// </summary>
    public  class InventoryInfoBusiness
    {
        #region 单例实现
        //private static readonly InventoryInfoBusiness lazy = new InventoryInfoBusiness();
        //public static InventoryInfoBusiness Instance
        //{
        //    get
        //    {
        //        return lazy;
        //    }
        //}
        #endregion

        #region 对象引用
        private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(InventoryInfoBusiness));

        #endregion

        #region 接口引用
        /// <summary>
        /// 货道信息
        /// </summary>
        private IBaseSpaceInfoServices _spaceInfoService;

        /// <summary>
        /// 货道明细
        /// </summary>
        private IBaseSpaceDetailServices _spaceDetailService;

        private IBaseBomInfoServices _bomInfoService;
        #endregion

        #region 委托事件
        /// <summary>
        /// 刷新货道明细
        /// </summary>
        /// <param name="taskInfos"></param>
        public delegate void RefreshSpaceDetails(List<BaseSpaceDetail> taskInfos);
        public event RefreshSpaceDetails RefreshSpaceDetailsEvent;

        #endregion

        public InventoryInfoBusiness()
        {
            _spaceInfoService = App.ServiceProvider.GetService<IBaseSpaceInfoServices>();
            _spaceDetailService = App.ServiceProvider.GetService<IBaseSpaceDetailServices>();
            _bomInfoService = App.ServiceProvider.GetService<IBaseBomInfoServices>();
        }

        /// <summary>
        /// 获取货道信息
        /// </summary>
        /// <param name="storeCode"></param>
        /// <returns></returns>
        public async Task<List<BaseSpaceInfo>> GetSpaceInfos(string storeCode)
        {
            List<BaseSpaceInfo> spaceInfos = null;
            try
            {
                spaceInfos =(await _spaceInfoService.GetSpaceInfosByStoreCode(storeCode)).OrderBy(x => x.ObjId).ToList();

            }
            catch (Exception ex)
            {
                logHelper.Error("获取货道信息异常", ex);
            }
            return spaceInfos;
        }

        /// <summary>
        /// 修改货道入库标识
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="spaceCode"></param>
        public async Task<bool> UpdateInStoreFlag(string storeCode, string spaceCode)
        {
            bool result = false;
            try
            {

                BaseSpaceInfo spaceInfo =await _spaceInfoService.GetSpaceInfoBySpaceCode(storeCode, spaceCode);
                if (spaceInfo != null)
                {
                    spaceInfo.InStoreFlag = spaceInfo.InStoreFlag == 1 ? 2 : 1;
                    result =await _spaceInfoService.UpdateSpaceInfo(spaceInfo);
                    logHelper.Info($"修改仓库:{storeCode};货道:{spaceCode};入库标识:{spaceInfo.InStoreFlag};修改{(result == true ? "成功" : "失败")}");
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("修改货道入库标识异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 修改货道出库标识
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="spaceCode"></param>
        /// <returns></returns>
        public async Task<bool> UpdateOutStoreFlag(string storeCode, string spaceCode)
        {
            bool result = false;
            try
            {

                BaseSpaceInfo spaceInfo =await _spaceInfoService.GetSpaceInfoBySpaceCode(storeCode, spaceCode);
                if (spaceInfo != null)
                {
                    spaceInfo.OutStoreFlag = spaceInfo.OutStoreFlag == 1 ? 2 : 1;
                    result =await _spaceInfoService.UpdateSpaceInfo(spaceInfo);
                    logHelper.Info($"修改仓库:{storeCode};货道:{spaceCode};出库标识:{spaceInfo.OutStoreFlag};修改{(result == true ? "成功" : "失败")}");
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("修改货道出库标识异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 修改异常货道标识
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="spaceCode"></param>
        /// <returns></returns>
        public async Task<bool> UpdateUnusualFlag(string storeCode, string spaceCode)
        {
            bool result = false;
            try
            {

                BaseSpaceInfo spaceInfo =await _spaceInfoService.GetSpaceInfoBySpaceCode(storeCode, spaceCode);
                if (spaceInfo != null)
                {
                    spaceInfo.UnusualFlag = spaceInfo.UnusualFlag == 1 ? 2 : 1;
                    result =await _spaceInfoService.UpdateSpaceInfo(spaceInfo);
                    logHelper.Info($"修改仓库:{storeCode};货道:{spaceCode};异常标识:{spaceInfo.UnusualFlag};修改{(result == true ? "成功" : "失败")}");
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("修改异常货道标识", ex);
            }
            return result;
        }

        /// <summary>
        /// 修改货道状态
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="spaceCode"></param>
        /// <returns></returns>
        public async Task<bool> UpdateSpaceStatus(string storeCode, string spaceCode)
        {
            bool result = false;
            try
            {

                BaseSpaceInfo spaceInfo =await _spaceInfoService.GetSpaceInfoBySpaceCode(storeCode, spaceCode);
                if (spaceInfo != null)
                {
                    spaceInfo.SpaceStatus = spaceInfo.SpaceStatus == 1 ? 2 : 1;
                    result =await _spaceInfoService.UpdateSpaceInfo(spaceInfo);
                    logHelper.Info($"修改仓库:{storeCode};货道:{spaceCode};货道状态:{spaceInfo.UnusualFlag};修改{(result == true ? "成功" : "失败")}");
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("修改异常货道标识", ex);
            }
            return result;
        }

        /// <summary>
        /// 刷新货道明细
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="spaceCode"></param>
        /// <returns></returns>
        public async void RefreshBaseSpaceDetails(string storeCode, string spaceCode)
        {
            List<BaseSpaceDetail> spaceDetails =await _spaceDetailService.GetSpaceDetailsBySpaceCode(storeCode, spaceCode);
            if (spaceDetails != null)
            {
                RefreshSpaceDetailsEvent?.Invoke(spaceDetails);
            }
        }

        /// <summary>
        /// 获取货道明细
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="spaceCode"></param>
        /// <returns></returns>
        public async Task<List<BaseSpaceDetail>> GetBaseSpaceDetails(string storeCode, string spaceCode)
        {
            List<BaseSpaceDetail> spaceDetails =await _spaceDetailService.GetSpaceDetailsBySpaceCode(storeCode, spaceCode);
            return spaceDetails;
        }
    }
}