using Admin.Core.IRepository;
using Admin.Core.IService;
using Admin.Core.Model;
using Microsoft.IdentityModel.Logging;
using System.Collections.Generic;
using System.Linq.Expressions;
using System;
using System.Threading.Tasks;
using log4net;
using Org.BouncyCastle.Asn1.Tsp;
using System.Linq;
using Admin.Core.Common;
using Admin.Core.Model.Sys;
using NPOI.SS.Formula.Functions;

namespace Admin.Core.Service
{
    public class RealTaskInfoServices : BaseServices<RealTaskInfo>, IRealTaskInfoServices
    {
        private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(RealTaskInfoServices));
       
        IBaseRepository<RealTaskInfo> _dal;
        private readonly IRealTaskInfoRepository _realTaskInfoRepository;
        public RealTaskInfoServices(IBaseRepository<RealTaskInfo> dal, IRealTaskInfoRepository realTaskInfoRepository)
        {
            this._dal = dal;
            base.BaseDal = dal;
            _realTaskInfoRepository= realTaskInfoRepository;
        }

        public Task<RealTaskInfo> FirstAsync()
        {
            return _realTaskInfoRepository.FirstAsync();
        }

        /// <summary>
        /// 添加任务信息
        /// </summary>
        /// <param name="taskInfo"></param>
        /// <returns></returns>
        public async Task<bool> AddTaskInfo(RealTaskInfo taskInfo)
        {
            bool result = false;
            try
            {
                int r =await _dal.AddAsync(taskInfo);
                if (r > 0) { result=true; }
            }
            catch (Exception ex)
            {
                logHelper.Error("添加任务信息异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 删除任务信息
        /// </summary>
        /// <param name="taskInfo"></param>
        public async Task<bool> DeleteTaskInfo(string taskCode, string storeCode = null)
        {
            bool result = false;
            try
            {
                RealTaskInfo taskInfo =await GetTaskInfoByTaskCode(taskCode, storeCode);
                if (taskInfo != null)
                {
                    result = await _dal.DeleteAsync(taskInfo);
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("删除任务信息异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 更新任务信息
        /// </summary>
        /// <param name="taskInfo"></param>
        /// <returns></returns>
        public async Task<bool> UpdateTaskInfo(RealTaskInfo taskInfo)
        {
            bool result = false;
            try
            {
                result =await _dal.UpdateAsync(taskInfo);
            }
            catch (Exception ex)
            {
                logHelper.Error("更新任务信息异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 批量更新任务信息
        /// </summary>
        /// <param name="taskInfos"></param>
        /// <returns></returns>
        public async Task<bool> UpdateRangeTaskInfoAsync(List<RealTaskInfo> taskInfos)
        {
            bool result = false;
            try
            {
                result = await _dal.UpdateAsync(taskInfos);
            }
            catch (Exception ex)
            {
                logHelper.Error("更新任务信息异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 通过任务编号更新任务状态
        /// </summary>
        /// <param name="taskCode"></param>
        /// <param name="taskStatus"></param>
        /// <returns></returns>
        public async Task<bool> UpdateTaskStatusByTaskCode(string taskCode, int taskStatus)
        {
            bool result = false;
            RealTaskInfo taskInfo = null;
            try
            {
                taskInfo =await _dal.FirstAsync(x => x.TaskCode == taskCode);

                if (taskInfo != null)
                {
                    taskInfo.TaskStatus = taskStatus;
                    result =await _dal.UpdateAsync(taskInfo);
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("通过任务编号更新任务状态异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 通过仓库编号获取待执行的任务信息,根据时间依次获取
        /// </summary>
        /// <param name="storeCode"></param>
        /// <returns></returns>
        public async Task<RealTaskInfo> GetTaskInfoByStoreCode(string storeCode, int taskType)
        {
            RealTaskInfo taskInfo = null;
            try
            {
                var list = await _dal.QueryAsync(x => x.StoreCode == storeCode && x.TaskStatus == 1 && x.TaskType == taskType);
                if (list.Count()>0)
                {
                    taskInfo = list.OrderBy(x => x.CreateTime).FirstOrDefault();
                }               
            }
            catch (Exception ex)
            {
                logHelper.Error("通过仓库编号获取待执行的任务信息异常", ex);
            }
            return taskInfo;
        }

        /// <summary>
        /// 根据任务号获取任务信息
        /// </summary>
        /// <param name="taskCode"></param>
        /// <returns></returns>
        public async Task<RealTaskInfo> GetTaskInfoByTaskCode(string taskCode, string storeCode)
        {
            RealTaskInfo taskInfo = null;
            try
            {
                taskInfo =await _dal.FirstAsync(x => x.StoreCode == storeCode && x.TaskCode == taskCode);
            }
            catch (Exception ex)
            {
                logHelper.Error("根据任务号获取任务信息异常", ex);
            }
            return taskInfo;
        }

        /// <summary>
        /// 通过仓库编号获取任务
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="taskType"></param>
        /// <returns></returns>
        public async Task<List<RealTaskInfo>> GetTaskInfosByStoreCode(string[] storeCode, int taskType)
        {
            List<RealTaskInfo> taskInfos = null;
            try
            {
                Expression<Func<RealTaskInfo, bool>> exp = s1 => true;
                exp = exp.And(x => x.TaskType == taskType && x.TaskStatus != 3 && storeCode.Contains(x.StoreCode));

                taskInfos = await _dal.QueryAsync(exp);
            }
            catch (Exception ex)
            {
                logHelper.Error("根据任务号获取任务信息异常", ex);
            }
            return taskInfos;
        }

        /// <summary>
        /// 获取指定状态的任务列表,如果为0返回所有状态
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="taskType"></param>
        /// <param name="taskStatus"></param>
        /// <returns></returns>
        public async Task<List<RealTaskInfo>> GetTaskInfosByTaskStatus(string[] storeCode, int taskType, int taskStatus)
        {
            List<RealTaskInfo> taskInfos = null;
            try
            {
                //Expression<Func<RealTaskInfo, bool>> exp = s1 => true;
                //exp = exp.And(d =>d.TaskType == taskType && storeCode.Contains(d.StoreCode));


                Expression<Func<RealTaskInfo, bool>> whereExpression = x => true;
                whereExpression = whereExpression.And(d => d.TaskType == taskType && storeCode.Contains(d.StoreCode));

                taskInfos = await _dal.QueryAsync(whereExpression);
                if (taskStatus != 0)
                {
                    taskInfos = taskInfos.Where(x => x.TaskStatus == taskStatus).ToList();
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("获取指定状态的任务信息异常", ex);
            }
            return taskInfos;
        }

        public async Task<List<RealTaskInfo>> GetTaskInfosByTaskCode(string taskCode)
        {
            List<RealTaskInfo> taskInfos = null;
            try
            {
                Expression<Func<RealTaskInfo, bool>> exp = s1 => true;
                exp = exp.And(x => x.TaskCode == taskCode);
                taskInfos =await _dal.QueryAsync(exp);
            }
            catch (Exception ex)
            {
                logHelper.Error("获取指定状态的任务信息异常", ex);
            }
            return taskInfos;
        }

        public async Task<bool> DeleteTaskInfoById(int id)
        {
            return await _dal.DeleteByIdAsync(id);
        }

        public Task<bool> UpdateRangeTaskInfo(List<RealTaskInfo> taskInfos)
        {
            throw new NotImplementedException();
        }
    }
}