using DocumentFormat.OpenXml.Office2013.Excel;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Vml;
using DocumentFormat.OpenXml.Wordprocessing;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using MassTransit;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.Extensions.Options;
using MimeKit;
using NPOI.SS.Formula.Functions;
using NPOI.Util;
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;
/// 
/// 用户提交 发送邮件 通知SPM 或者PM
/// 
public class UserSiteSurveySubmitedEventConsumer(
      IRepository _trialRepository,
      IRepository _trialSiteRepository,
       IRepository _trialUserRoleRepository,
      IRepository _trialSiteSurveyRepository,
      IRepository _emailNoticeConfigrepository,
      IOptionsMonitor systemEmailConfig
    ) : IConsumer
{
    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext context)
    {
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
        var trialSiteSurveyId = context.Message.TrialSiteSurveyId;
        var siteSurveyInfo = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).FirstOrDefault().IfNullThrowException();
        var trialId = siteSurveyInfo.TrialId;
        var trialUserList = await _trialUserRoleRepository.Where(t => t.TrialId == siteSurveyInfo.TrialId)
            .Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.SPM || t.UserRole.UserTypeEnum == UserTypeEnum.CPM || t.UserRole.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserRole.UserTypeEnum == UserTypeEnum.APM)
            .Select(t => new { t.UserRole.FullName, t.UserRole.IdentityUser.EMail, t.UserRole.UserTypeEnum }).ToListAsync();
        var sPMOrCPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.SPM || t.UserTypeEnum == UserTypeEnum.CPM).ToList();
        var pmAndAPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserTypeEnum == UserTypeEnum.APM).ToList();
        var messageToSend = new MimeMessage();
        var toUserName = string.Empty;
        //有SPM
        if (sPMOrCPMList.Count > 0)
        {
            foreach (var user in sPMOrCPMList)
            {
                messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
            }
            toUserName = string.Join('、', sPMOrCPMList.Select(t => t.FullName));
            foreach (var user in pmAndAPMList)
            {
                messageToSend.Cc.Add(new MailboxAddress(user.FullName, user.EMail));
            }
        }
        else
        {
            foreach (var user in pmAndAPMList)
            {
                messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
            }
            toUserName = string.Join('、', pmAndAPMList.Select(t => t.FullName));
        }
        //发件地址
        messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
        var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.Id == siteSurveyInfo.TrialSiteId, true);
        var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
        Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
        {
            var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo);
            var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
                toUserName,
            siteInfo.TrialSiteCode,
            siteInfo.TrialSiteAliasName,
            siteSurveyInfo.UserName,
            siteSurveyInfo.Email,
            siteSurveyInfo.Phone,
            _systemEmailConfig.SiteUrl
                );
            return (topicStr, htmlBodyStr);
        };
        var scenario = _trialSiteSurveyRepository.Where(t => t.Id != trialSiteSurveyId && t.TrialId == siteSurveyInfo.TrialId && t.TrialSiteId == siteSurveyInfo.TrialSiteId).IgnoreQueryFilters().Any() ?
          EmailBusinessScenario.Approval_UpdateSiteSurvey : EmailBusinessScenario.Approval_SubmitSiteSurvey;
        await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, scenario, messageToSend, emailConfigFunc);
        await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
    }
}
/// 
/// 调研表初审通过,进行复审发送邮件
/// 
public class SiteSurveySPMSubmitedEventConsumer(
      IRepository _trialRepository,
      IRepository _trialUserRoleRepository,
      IRepository _trialSiteRepository,
      IRepository _trialSiteSurveyRepository,
      IRepository _emailNoticeConfigrepository,
      IOptionsMonitor systemEmailConfig) : IConsumer
{
    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext context)
    {
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
        var trialSiteSurveyId = context.Message.TrialSiteSurveyId;
        var siteSurveyInfo = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).FirstOrDefault().IfNullThrowException();
        var trialId = siteSurveyInfo.TrialId;
        var messageToSend = new MimeMessage();
        var trialUserList = _trialUserRoleRepository.Where(t => t.TrialId == trialId)
            .Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.SPM || t.UserRole.UserTypeEnum == UserTypeEnum.CPM || t.UserRole.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserRole.UserTypeEnum == UserTypeEnum.APM)
            .Select(t => new { t.UserRole.IdentityUser.EMail, t.UserRole.FullName, t.UserRole.UserTypeEnum }).ToList();
        var sPMOrCPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.SPM || t.UserTypeEnum == UserTypeEnum.CPM).ToList();
        var pmAndAPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserTypeEnum == UserTypeEnum.APM).ToList();
        var toUserName = string.Empty;
        foreach (var item in pmAndAPMList)
        {
            messageToSend.To.Add(new MailboxAddress(item.FullName, item.EMail));
            toUserName = string.Join('、', pmAndAPMList.Select(t => t.FullName));
        }
        //发件地址
        messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
        var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.Id == siteSurveyInfo.TrialSiteId, true);
        var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
        Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
        {
            var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo);
            var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
            toUserName,
            siteInfo.TrialSiteCode,
            siteInfo.TrialSiteAliasName,
           siteSurveyInfo.UserName,
           siteSurveyInfo.Email,
           siteSurveyInfo.Phone,
           _systemEmailConfig.SiteUrl
                );
            return (topicStr, htmlBodyStr);
        };
        await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, EmailBusinessScenario.Approval_SubmitSiteSurvey, messageToSend, emailConfigFunc);
        await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
    }
}
/// 
/// 调研表驳回发送邮件    之前已有,需要迁移过来
/// 
public class SiteSurverRejectedEventConsumer(
       IRepository _trialUserRoleRepository,
      IRepository _trialRepository,
      IRepository _trialSiteRepository,
      IRepository _trialSiteSurveyRepository,
      IRepository _emailNoticeConfigrepository,
      IOptionsMonitor systemEmailConfig
    ) : IConsumer
{
    private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
    public async Task Consume(ConsumeContext context)
    {
        var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
        var trialSiteSurveyId = context.Message.TrialSiteSurveyId;
        var siteSurveyInfo = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).FirstOrDefault().IfNullThrowException();
        var trialId = siteSurveyInfo.TrialId;
        var messageToSend = new MimeMessage();
        var toUserName = siteSurveyInfo.UserName;
        if (context.Message.IsHaveSPMOrCPM)
        {
            //PM 驳回到SPM
            if (siteSurveyInfo.State == TrialSiteSurveyEnum.CRCSubmitted)
            {
                //var user = await _userRoleRepository.FirstOrDefaultAsync(t => t.Id == siteSurveyInfo.PreliminaryUserId);
                //name = user.FullName;
                var sPMOrCPMList = _trialUserRoleRepository.Where(t => t.TrialId == trialId)
                  .Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.SPM || t.UserRole.UserTypeEnum == UserTypeEnum.CPM)
                  .Select(t => new { t.UserRole.IdentityUser.EMail, t.UserRole.FullName, t.UserRole.UserTypeEnum }).ToList();
                foreach (var user in sPMOrCPMList)
                {
                    messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
                }
                toUserName = string.Join('、', sPMOrCPMList.Select(t => t.FullName));
            }
            //SPM 驳回到CRC
            else if (siteSurveyInfo.State == TrialSiteSurveyEnum.ToSubmit)
            {
                messageToSend.To.Add(new MailboxAddress(toUserName, siteSurveyInfo.Email));
            }
        }
        else
        {
            //没有SPM  PM驳回到CRC
            messageToSend.To.Add(new MailboxAddress(String.Empty, siteSurveyInfo.Email));
        }
        //发件地址
        messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
        var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
        var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.Id == siteSurveyInfo.TrialSiteId, true);
        var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
        Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
        {
            var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo);
            var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
           toUserName,
            trialInfo.TrialCode,
                 trialInfo.ResearchProgramNo,
                trialInfo.ExperimentName,
            siteInfo.TrialSiteCode,
            siteInfo.TrialSiteAliasName,
               siteSurveyInfo.LatestBackReason,
            _systemEmailConfig.SiteUrl,
               (siteSurveyInfo.State == TrialSiteSurveyEnum.ToSubmit ? "inline - block" : "none")
                );
            return (topicStr, htmlBodyStr);
        };
        await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, EmailBusinessScenario.SiteSurveyReject, messageToSend, emailConfigFunc);
        await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
    }
}