using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infra.EFCore.Common;
using MassTransit;
using Microsoft.Extensions.Options;
using MimeKit;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IRaCIS.Core.Application.MassTransit.Consumer;


/// <summary>
/// CRC 提交了 通知QC进行质控  Code005,006
/// </summary>
public class CRCSubmitedAndQCToAuditEventConsumer(
      IRepository<User> _userRepository,
        IRepository<TrialUser> _trialUseRepository,
       IRepository<SubjectVisit> _subjectVisitRepository,
      IRepository<Trial> _trialRepository,
      IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
      IRepository<VisitTask> _visitTaskRepository,
         IRepository<Dictionary> _dictionaryRepository,
      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCSubmitedAndQCToAuditEvent>
{
    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext<CRCSubmitedAndQCToAuditEvent> context)
    {
        Console.WriteLine("发送(005,006) 【加急项目所有IQC待领取质控任务】邮件!!!");
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;

        var subjectVisitId = context.Message.SubjectVisitId;

        var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstOrDefaultAsync();

        var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();

        var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();


        var pmandAPm = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();

        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);

        var auditStateCode = "AuditStatePE";

        if (trialInfo.QCProcessEnum == TrialQCProcess.DoubleAudit)
        {
            auditStateCode = "AuditStateRC";
        }



        var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
        {

            DictionaryRepository = _dictionaryRepository,
            IsEn_US = isEn_US,
            DictionaryList = new List<DictionaryDto>()
            {
             new DictionaryDto (){DictionaryCode= auditStateCode,EnumValue=subjectVisit.AuditState.GetEnumInt(), }, //审核状态

            }
        });

            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
        

            foreach (var userinfo in userinfoList)
            {
               messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
            }

            var userNames = userinfoList.Select(x => x.FullName).ToList();

            foreach (var pm in pmandAPm)
            {
                messageToSend.Cc.Add(new MailboxAddress(String.Empty, pm.EMail));
            }

            var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;



            Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
            {
                var subjectCode = subjectVisit.Subject.Code;
                var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
                var htmlBodyStr = string.Format(
                   CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
                   string.Join(',', userNames),  // 用户名  {0}
                   trialInfo.ExperimentName,        // 项目   {1}
                   subjectCode, // 受试者 {2}
                   subjectVisit.VisitName,             // 访视  {3}
                   dictionValue[0],    // 审核状态 {4}
                   _systemEmailConfig.SiteUrl             // 链接                  {5}
                    );

                return (topicStr, htmlBodyStr);
            };

            await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,

             context.Message.IsPd ? EmailBusinessScenario.PDVerification_PendingImageQCClaim : EmailBusinessScenario.EligibilityVerification_PendingClaim,

                messageToSend, emailConfigFunc);

            await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
       
    }
}


/// <summary>
/// CRC 回复质控质疑 通知QC  Code012,013
/// </summary>
public class CRCRepliedQCChallengeEventConsumer(
      IRepository<User> _userRepository,
        IRepository<TrialUser> _trialUseRepository,
       IRepository<SubjectVisit> _subjectVisitRepository,
      IRepository<Trial> _trialRepository,
      IRepository<QCChallenge> _qCChallengeRepository,
      IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
         IRepository<Dictionary> _dictionaryRepository,
      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCRepliedQCChallengeEvent>
{

    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext<CRCRepliedQCChallengeEvent> context)
    {
        Console.WriteLine("发送(Code012,013) 【CRC 回复质控质疑 通知QC】邮件!!!");
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;

        var subjectVisitId = context.Message.SubjectVisitId;

        var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).Include(x => x.CurrentActionUser).FirstNotNullAsync();


        var qCChallengeDialog = await _qCChallengeDialogRepository.Where(x => x.Id == context.Message.QCChallengeDialogId).Include(x => x.QCChallenge).FirstNotNullAsync();



        var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();




        var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
        var pmandAPm = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();


        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);


        var userinfo = subjectVisit.CurrentActionUser;

        var messageToSend = new MimeMessage();
        //发件地址
        messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
        messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));

        foreach (var pm in pmandAPm)
        {
            messageToSend.Cc.Add(new MailboxAddress(String.Empty, pm.EMail));
        }
        var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;


        var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
        {

            DictionaryRepository = _dictionaryRepository,
            IsEn_US = isEn_US,
            DictionaryList = new List<DictionaryDto>()
            {
             new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=qCChallengeDialog.QCChallenge.IsClosed.ToString().ToLower(), }, //是否关闭

            }
        });

        Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
        {
            var subjectCode = subjectVisit.Subject.Code;
            var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
            var htmlBodyStr = string.Format(
               CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
               userinfo.FullName,              // 用户名  {0}
               trialInfo.ExperimentName,        // 项目   {1}
               subjectCode, // 受试者 {2}
               subjectVisit.VisitName,             // 访视  {3}
               dictionValue[0],    // 是否关闭 {4}
               qCChallengeDialog.TalkContent,    // 质疑内容{5}
               _systemEmailConfig.SiteUrl             // 链接                  {6}
                );

            return (topicStr, htmlBodyStr);
        };

        await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,

         context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderQCQuery : EmailBusinessScenario.EligibilityVerification_Pending,

            messageToSend, emailConfigFunc);

        await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
    }
}


/// <summary>
/// QC回复 质控质疑,通知CRC (014,015)
/// </summary>
public class QCRepliedQCChallengeEventConsumer(
      IRepository<User> _userRepository,
        IRepository<TrialUser> _trialUseRepository,
       IRepository<SubjectVisit> _subjectVisitRepository,
      IRepository<Trial> _trialRepository,
      IRepository<QCChallenge> _qCChallengeRepository,
      IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
         IRepository<Dictionary> _dictionaryRepository,
      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<QCRepliedQCChallengeEvent>
{
    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext<QCRepliedQCChallengeEvent> context)
    {
        Console.WriteLine("发送(014,015) 【  QC回复 质控质疑,通知CRC】邮件!!!");
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;

        string talkContent = string.Empty;
        var isclose = false;
        if (context.Message.QCChallengeDialogId != null)
        {
            var qCChallengeDialog = await _qCChallengeDialogRepository.Where(x => x.Id == context.Message.QCChallengeDialogId.Value).Include(x => x.QCChallenge).FirstNotNullAsync();
            talkContent = qCChallengeDialog.TalkContent;
            isclose = qCChallengeDialog.QCChallenge.IsClosed;
        }
        else if(context.Message.QCChallengeId != null)
        {
            var qCChallenge = await _qCChallengeRepository.Where(x => x.Id == context.Message.QCChallengeId.Value).FirstNotNullAsync();
            talkContent = qCChallenge.Content;
            isclose = qCChallenge.IsClosed;
        }
       
        var subjectVisitId = context.Message.SubjectVisitId;

        var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstNotNullAsync();

        var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();

        var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();

        var craInfo = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).FirstOrDefault();

        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);




        var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
        {

            DictionaryRepository = _dictionaryRepository,
            IsEn_US = isEn_US,
            DictionaryList = new List<DictionaryDto>()
            {
          new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=isclose.ToString().ToLower(), }, //是否关闭

         }
        });


        foreach (var userinfo in userinfoList)
        {
            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
            messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
            if (craInfo != null)
            {
                messageToSend.Cc.Add(new MailboxAddress(String.Empty, craInfo.EMail));
            }

            var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;




            Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
            {
                var subjectCode = subjectVisit.Subject.Code;
                var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
                var htmlBodyStr = string.Format(
                   CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
                   userinfo.FullName,              // 用户名  {0}
                   trialInfo.ExperimentName,        // 项目   {1}
                   subjectCode, // 受试者 {2}
                   subjectVisit.VisitName,             // 访视  {3}
                   dictionValue[0],    // 质疑是否关闭 {4}
                   talkContent,    // 质疑内容 {5}
                   _systemEmailConfig.SiteUrl             // 链接                  {65}
                    );

                return (topicStr, htmlBodyStr);
            };

            await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,

             context.Message.IsPd ? EmailBusinessScenario.PDVerification_ImageQuery : EmailBusinessScenario.EligibilityVerification_ImageQuery,

                messageToSend, emailConfigFunc);

            await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
        }
    }
}


/// <summary>
/// CRC 回复一致性核查质疑 通知PM  (019,020)
/// </summary>
public class CRCRepliedCheckChallengeEventConsumer(
      IRepository<User> _userRepository,
        IRepository<TrialUser> _trialUseRepository,
       IRepository<SubjectVisit> _subjectVisitRepository,
      IRepository<Trial> _trialRepository,
      IRepository<QCChallenge> _qCChallengeRepository,
      IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
         IRepository<Dictionary> _dictionaryRepository,
      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCRepliedCheckChallengeEvent>
{

    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext<CRCRepliedCheckChallengeEvent> context)
    {
        Console.WriteLine("发送(019,020) 【 CRC 回复一致性核查质疑 通知PM】邮件!!!");
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;

        var subjectVisitId = context.Message.SubjectVisitId;

        var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstNotNullAsync();

        var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();

        var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();


        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);




        var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
        {

            DictionaryRepository = _dictionaryRepository,
            IsEn_US = isEn_US,
            DictionaryList = new List<DictionaryDto>()
         {
          new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //审核状态

         }
        });


        foreach (var userinfo in userinfoList)
        {
            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
            messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));


            var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;




            Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
            {
                var subjectCode = subjectVisit.Subject.Code;
                var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
                var htmlBodyStr = string.Format(
                   CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
                   userinfo.FullName,              // 用户名  {0}
                   trialInfo.ExperimentName,        // 项目   {1}
                   subjectCode, // 受试者 {2}
                   subjectVisit.VisitName,             // 访视  {3}
                   dictionValue[0],    // 核查状态 {4}
                   _systemEmailConfig.SiteUrl             // 链接                  {5}
                    );

                return (topicStr, htmlBodyStr);
            };

            await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,

             context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderDRForPMOrAPM : EmailBusinessScenario.EligibilityVerification_UnderDRForPMOrAPM,

                messageToSend, emailConfigFunc);

            await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
        }
    }
}



/// <summary>
/// PM 一致性核查 通知CRC (016,017)

/// </summary>
public class PMRepliedCheckChallengeEventConsumer(
      IRepository<User> _userRepository,
        IRepository<TrialUser> _trialUseRepository,
       IRepository<SubjectVisit> _subjectVisitRepository,
      IRepository<Trial> _trialRepository,
      IRepository<CheckChallengeDialog> _checkChallengeDialogRepository,
      IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
         IRepository<Dictionary> _dictionaryRepository,
      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<PMRepliedCheckChallengeEvent>
{

    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext<PMRepliedCheckChallengeEvent> context)
    {
        Console.WriteLine("发送(016,017) 【  PM 一致性核查 通知CRC】邮件!!!");
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
        var checkChallengeDialog = await _checkChallengeDialogRepository.Where(x => x.Id == context.Message.CheckChallengeDialogId).FirstNotNullAsync();
        var subjectVisitId = context.Message.SubjectVisitId;

        var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.NoneDicomStudyList).Include(x => x.StudyList).Include(x => x.Subject).FirstNotNullAsync();

        var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();

        var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();

        var craInfo = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).FirstOrDefault();

        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);

     
        List<string> modalities = new List<string>();
        modalities =subjectVisit.NoneDicomStudyList.Select(t => t.Modality)
 .Union(subjectVisit.StudyList.Select(k => k.ModalityForEdit)).ToList();

        var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
        {

            DictionaryRepository = _dictionaryRepository,
            IsEn_US = isEn_US,
            DictionaryList = new List<DictionaryDto>()
         {
            new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //核查状态

         }
        });


        foreach (var userinfo in userinfoList)
        {
            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
            messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
            if (craInfo != null)
            {
                messageToSend.Cc.Add(new MailboxAddress(String.Empty, craInfo.EMail));
            }

            var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;




            Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
            {
                var subjectCode = subjectVisit.Subject.Code;
                var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
                var htmlBodyStr = string.Format(
                   CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
                   userinfo.FullName,              // 用户名  {0}
                   trialInfo.ExperimentName,        // 项目   {1}
              
                   subjectCode, // 受试者 {2}
                   subjectVisit.VisitName,             // 访视  {3}
                  string.Join(',', modalities),    // 检查类型 {4}
                   dictionValue[0],    // 核查状态 {5}
                   checkChallengeDialog.TalkContent,// 质疑内容{6}
                   _systemEmailConfig.SiteUrl             // 链接                  {7}
                    );

                return (topicStr, htmlBodyStr);
            };

            await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,

             context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderDR : EmailBusinessScenario.EligibilityVerification_UnderDR,

                messageToSend, emailConfigFunc);

            await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
        }
    }
}


/// <summary>
/// 通知PM 进行一致性核查 (018,030)
/// </summary>
public class CheckStateChangedToAuditEventConsumer(
      IRepository<User> _userRepository,
        IRepository<TrialUser> _trialUseRepository,
       IRepository<SubjectVisit> _subjectVisitRepository,
      IRepository<Trial> _trialRepository,
      IRepository<QCChallenge> _qCChallengeRepository,
      IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
         IRepository<Dictionary> _dictionaryRepository,
      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CheckStateChangedToAuditEvent>
{
    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext<CheckStateChangedToAuditEvent> context)
    {
        Console.WriteLine("发送(018,030) 【通知PM 进行一致性核查】邮件!!!");
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;

        var subjectVisitId = context.Message.SubjectVisitId;

        var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstNotNullAsync();

        var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();

        var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();


        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);




        var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
        {

            DictionaryRepository = _dictionaryRepository,
            IsEn_US = isEn_US,
            DictionaryList = new List<DictionaryDto>()
            {
             new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //审核状态

            }
        });


        foreach (var userinfo in userinfoList)
        {
            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
            messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));


            var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;




            Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
            {
                var subjectCode = subjectVisit.Subject.Code;
                var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
                var htmlBodyStr = string.Format(
                   CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
                    trialInfo.ExperimentName,        // 项目   {1}
                   userinfo.FullName,              // 用户名  {1}
                   subjectCode, // 受试者 {2}
                   subjectVisit.VisitName,             // 访视  {3}
                   dictionValue[0],    // 核查状态 {4}
                   _systemEmailConfig.SiteUrl             // 链接                  {5}
                    );

                return (topicStr, htmlBodyStr);
            };

            await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,

             context.Message.IsPd ? EmailBusinessScenario.PDVerification_DR : EmailBusinessScenario.EligibilityVerification_DR,

                messageToSend, emailConfigFunc);

            await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
        }
    }
}

/// <summary>
/// QC 领取了质控任务 (007,008) 
/// </summary>
public class QCClaimTaskEventConsumer(
      IRepository<User> _userRepository,
        IRepository<TrialUser> _trialUseRepository,
       IRepository<SubjectVisit> _subjectVisitRepository,
      IRepository<Trial> _trialRepository,
      IRepository<QCChallenge> _qCChallengeRepository,
      IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
         IRepository<Dictionary> _dictionaryRepository,
      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<QCClaimTaskEvent>
{
    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext<QCClaimTaskEvent> context)
    {
        Console.WriteLine("发送(Code007,008) 【QC 领取了质控任务】邮件!!!");
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;

        var subjectVisitId = context.Message.SubjectVisitId;

        var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).Include(x => x.CurrentActionUser).FirstNotNullAsync();


        var subjectVisitList = await _subjectVisitRepository.Where(x => x.CurrentActionUserId == context.Message.CurrentActionUserId && x.TrialId == subjectVisit.TrialId).Include(x => x.Subject).ToListAsync();

       



        var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();




      
        var pmandAPm = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();


        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);


        var userinfo = subjectVisit.CurrentActionUser;

        var messageToSend = new MimeMessage();
        //发件地址
        messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
        messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));

        foreach (var pm in pmandAPm)
        {
            messageToSend.Cc.Add(new MailboxAddress(String.Empty, pm.EMail));
        }
        var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;

        var auditStateCode = "AuditStatePE";

        if (trialInfo.QCProcessEnum == TrialQCProcess.DoubleAudit)
        {
            auditStateCode = "AuditStateRC";
        }

        var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
        {
            DictionaryRepository = _dictionaryRepository,
            IsEn_US = isEn_US,
            DictionaryList = new List<DictionaryDto>()
         {
          new DictionaryDto (){DictionaryCode= auditStateCode,EnumValue=subjectVisit.AuditState.GetEnumInt(), }, //审核状态

         }
        });

        var subjectcodes = subjectVisitList.Select(x => x.Subject.Code).Distinct().ToList();
        var visitnames = subjectVisitList.Select(x => x.VisitName).Distinct().ToList();

        Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
        {
            var subjectCode = subjectVisit.Subject.Code;
            var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
            var htmlBodyStr = string.Format(
               CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
               userinfo.FullName,              // 用户名  {0}
               trialInfo.ExperimentName,        // 项目   {1}
               string.Join(',', subjectcodes), // 受试者 {2}
              string.Join(',', visitnames),             // 访视  {3}
               dictionValue[0],    // 审核状态 {4}
 
               _systemEmailConfig.SiteUrl             // 链接                  {5}
                );

            return (topicStr, htmlBodyStr);
        };

        await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,

         context.Message.IsPd ? EmailBusinessScenario.PDVerification_PendingImageQC : EmailBusinessScenario.EligibilityVerification_PendingImageQC,

            messageToSend, emailConfigFunc);

        await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
    }
}