using EasyCaching.Core;
using IRaCIS.Core.Domain.Share;
using Microsoft.Extensions.Logging;

namespace IRaCIS.Application.Services.BackGroundJob
{

    public interface IIRaCISCacheHangfireJob
    {
        Task MemoryCacheTrialStatus();
    }
    public class IRaCISCacheHangfireJob: IIRaCISCacheHangfireJob
    {
        private readonly IRepository<Trial> _trialRepository;
        private readonly IEasyCachingProvider _provider;
        private readonly ILogger<IRaCISCacheHangfireJob> _logger;
        private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository;

        public IRaCISCacheHangfireJob(IRepository<Trial> trialRepository, IRepository<SystemAnonymization> systemAnonymizationRepository,   IEasyCachingProvider provider,ILogger<IRaCISCacheHangfireJob> logger)
        {
            _trialRepository = trialRepository;
            _provider = provider;
            _logger = logger;
            _systemAnonymizationRepository = systemAnonymizationRepository;
        }
        public async Task MemoryCacheTrialStatus()
        {
            _logger.LogInformation("hangfire 定时任务开始~");
            try
            {
                await CacheTrialStatusAsync();

                await CacheAnonymizeAsync();
            }
            catch (Exception e)
            {
                _logger.LogError("hangfire 定时任务执行失败"+e.Message);

            }
           
            _logger.LogInformation("hangfire 定时任务执行结束");

        }



        private async Task CacheTrialStatusAsync()
        {
            var list = await  _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr })
                  .ToListAsync();

            list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7)));
        }

        private async Task CacheAnonymizeAsync()
        {
            var systemAnonymizationList =   await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync();

            _provider.Set(StaticData.Anonymize.Anonymize_AddFixedFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed).ToList(), TimeSpan.FromDays(7));
            _provider.Set(StaticData.Anonymize.Anonymize_AddIRCInfoFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed == false).ToList(), TimeSpan.FromDays(7));
            _provider.Set(StaticData.Anonymize.Anonymize_FixedField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed).ToList(), TimeSpan.FromDays(7));
            _provider.Set(StaticData.Anonymize.Anonymize_IRCInfoField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed == false).ToList(), TimeSpan.FromDays(7));
        }
    }
}