using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using MassTransit;
using MassTransit.Scheduling;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.MassTransit.Consumer;
/// 
/// QC 影像质疑
/// 
public class QCImageQuestionRecurringEventConsumer(IRepository _trialRepository,
    IRepository _trialEmailNoticeConfigRepository,
      IRepository _trialUserRoleRepository,
      IRepository _visitTaskRepository,
      IRepository _trialSiteUserRoleRepository,
      IOptionsMonitor _SystemEmailSendConfig) : IConsumer
{
    public async Task Consume(ConsumeContext context)
    {
        var trialId = context.Message.TrialId;
        var isEn_us = false;
        var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();
        //找到 该项目的CRC 用户Id
        var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync();
        //判断是否任务可以领取 ,可以的话 发送邮件
        foreach (var user in userList)
        {
            var userId = user.UserId;
            //过滤项目  并且 将 _userInfo.Id 换位 当前发送邮件的Id
            var query = _trialRepository.Where(t => t.Id == trialId)
             .Select(t => new
             {
                 //质疑待处理
                 ToBeDealedCount = t.SubjectVisitList.Where(t => t.TrialSite.CRCUserList.Any(t => t.UserId == userId)).SelectMany(c => c.QCChallengeList)
                 .Where(u => u.IsClosed == false && (u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC || u.LatestReplyUserId == null)).Count(),
             });
            var sendStat = await query.FirstOrDefaultAsync();
            //当前人 
            if (sendStat != null && (sendStat.ToBeDealedCount > 0))
            {
                Func topicAndHtmlFunc = trialEmailConfig =>
                {
                    var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
                    var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
                        user.FullName, DateTime.Now, sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
                    return (topicStr, htmlBodyStr, isEn_us, userId);
                };
                await OldRecurringEmailHelper.SendTrialEmailAsync(
                      _trialEmailNoticeConfigRepository,
                         _trialRepository,
                          _trialUserRoleRepository,
                          _visitTaskRepository,
                     _trialSiteUserRoleRepository,
                    trialId, EmailBusinessScenario.QCToCRCImageQuestion, topicAndHtmlFunc);
            }
        }
    }
}
/// 
/// CRC 影像质疑
/// 
public class CRCImageQuestionRecurringEventConsumer(IRepository _trialRepository,
    IRepository _trialEmailNoticeConfigRepository,
      IRepository _trialUserRoleRepository,
      IRepository _visitTaskRepository,
      IRepository _trialSiteUserRoleRepository,
      IOptionsMonitor _SystemEmailSendConfig) : IConsumer
{
    public async Task Consume(ConsumeContext context)
    {
        var trialId = context.Message.TrialId;
        var isEn_us = false;
        var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstNotNullAsync();
        //找到 该项目的IQC 用户Id
        var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync();
        //判断是否任务可以领取 ,可以的话 发送邮件
        foreach (var user in userList)
        {
            var userId = user.UserId;
            //过滤项目  并且 将 _userInfo.Id 换位 当前发送邮件的Id
            var query = _trialRepository
                .Where(t => t.Id == trialId)
             .Select(t => new
             {
                 ReUploadTobeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
                 .Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.ReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload).Count(),
                 //质疑待处理  发送邮件的时候 需要减去ReUploadTobeDealedCount  
                 ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
                 .Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(),
             });
            var sendStat = await query.FirstOrDefaultAsync();
            //当前人 
            if (sendStat != null && (sendStat.ToBeDealedCount > 0 || sendStat.ReUploadTobeDealedCount > 0))
            {
                Func topicAndHtmlFunc = trialEmailConfig =>
                {
                    var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
                    var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
                        user.FullName, DateTime.Now, sendStat.ToBeDealedCount - sendStat.ReUploadTobeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
                    return (topicStr, htmlBodyStr, false, userId);
                };
                await OldRecurringEmailHelper.SendTrialEmailAsync(_trialEmailNoticeConfigRepository,
                         _trialRepository,
                          _trialUserRoleRepository,
                          _visitTaskRepository,
                     _trialSiteUserRoleRepository,
                    trialId, EmailBusinessScenario.CRCToQCQuestion, topicAndHtmlFunc);
            }
        }
    }
}
/// 
/// 影像质控  发送给QC的
/// 
public class ImageQCRecurringEventConsumer(IRepository _trialRepository,
    IRepository _trialEmailNoticeConfigRepository,
      IRepository _trialUserRoleRepository,
      IRepository _visitTaskRepository,
      IRepository _trialSiteUserRoleRepository,
      IOptionsMonitor _SystemEmailSendConfig) : IConsumer
{
    public async Task Consume(ConsumeContext context)
    {
        var trialId=context.Message.TrialId;
        var isEn_us = false;
        var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();
        //找到 该项目的IQC 用户Id
        var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync();
        //判断是否任务可以领取 ,可以的话 发送邮件
        var userIdList = userList.Select(t => t.UserId).ToList();
        foreach (var user in userList)
        {
            var userId = user.UserId;
            //过滤项目  并且 将 _userInfo.Id 换位 当前发送邮件的Id
            var query = _trialRepository.Where(t => t.Id == trialId)
            .Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit)
            .Select(t => new
            {
                //待领取量
                ToBeClaimedCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.Submitted && u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != userId && u.ReviewAuditUserId == null))).Count(),
                //待审核通过,统计从已领取到QC提交之间的      已领取 待审核 审核中   (审核完成  领取人就会清理 所以只用查询当前领取人是自己的就好了)
                ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == userId).Count()
            });
            var sendStat = await query.FirstOrDefaultAsync();
            //当前人 有待领取的或者有待审核的才发邮件
            if (sendStat != null && (sendStat.ToBeClaimedCount > 0 || sendStat.ToBeReviewedCount > 0))
            {
                Func topicAndHtmlFunc = trialEmailConfig =>
                {
                    var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
                    var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
                        user.FullName, DateTime.Now, sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
                    return (topicStr, htmlBodyStr, false, userId);
                };
                await OldRecurringEmailHelper.SendTrialEmailAsync(
                     _trialEmailNoticeConfigRepository,
                         _trialRepository,
                          _trialUserRoleRepository,
                          _visitTaskRepository,
                     _trialSiteUserRoleRepository,
                    trialId, EmailBusinessScenario.QCTask, topicAndHtmlFunc);
            }
        }
    }
}