using Microsoft.Extensions.DependencyInjection;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using SlnMesnac.Repository.service.@base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* 版权所有 (c) 2024 WenJY 保留所有权利。
* CLR版本：4.0.30319.42000
* 机器名称：LAPTOP-E0N2L34V
* 命名空间：SlnMesnac.Repository.service.Impl
* 唯一标识：8293a517-9203-40d4-b4f2-49ebfad4e381
*
* 创建者：WenJY
* 电子邮箱：wenjy@mesnac.com
* 创建时间：2024-04-09 17:33:10
* 版本：V1.0.0
* 描述：
*
*--------------------------------------------------------------------
* 修改人：
* 时间：
* 修改说明：
*
* 版本：V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
namespace SlnMesnac.Repository.service.Impl
{
    public class RealPalletTaskServiceImpl : BaseServiceImpl<RealPalletTask>, IRealPalletTaskService
    {
        private IServiceProvider _serviceProvider;
        public RealPalletTaskServiceImpl(Repository<RealPalletTask> rep, IServiceProvider serviceProvider) : base(rep)
        {
            _serviceProvider = serviceProvider;
        }

        public void InsertPalletTask(RealPalletTask task)
        {
            

            try
            {
                if (task == null)
                {
                    throw new ArgumentNullException($"保存托盘队列信息异常:参数为空");
                }
                var taskInfos = Query(x => x.PalletCode == task.PalletCode).ToList();

                //if(taskInfos.Count > 0)
                //{
                //    Deletes(taskInfos);
                //}

                Insert(task);

                RefreshLocalTask();
            }
            catch (Exception e)
            {
                throw new InvalidOperationException($"保存托盘队列信息异常:{e.Message}");
            }
        }

        /// <summary>
        /// 移除托盘队列
        /// </summary>
        /// <param name="palletCode"></param>
        /// <exception cref="InvalidOperationException"></exception>
        public void RemovePalletTask(string palletCode)
        {
            try
            {
                if (string.IsNullOrEmpty(palletCode))
                {
                    throw new ArgumentNullException($"移除托盘队列信息异常:参数为空");
                }

                var taskInfos = Query(x=>x.PalletCode == palletCode).ToList();

                Deletes(taskInfos);

                RefreshLocalTask();
            }
            catch (Exception e)
            {
                throw new InvalidOperationException($"移除托盘队列信息异常:{e.Message}");
            }
        }

        /// <summary>
        /// 刷新托盘队列缓存信息
        /// </summary>
        /// <param name="palletTasks"></param>
        /// <exception cref="InvalidOperationException"></exception>
        private void RefreshLocalTask()
        {
            try
            {

                using (var scope = _serviceProvider.CreateScope())
                {
                    var info = scope.ServiceProvider.GetRequiredService<List<RealPalletTask>>();

                    var infos = base.Query(x => 1 == 1, y => y.RecordTime, true).ToList();

                    info.Clear();

                    info.AddRange(infos);

                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException($"刷新托盘信息缓存队列异常:{e.Message}");
            }
        }
    }
}
