//--------------------------------------------------------------------
//     此代码由T4模板自动生成  byzhouhang 20210918
//	   生成时间 2022-10-20 11:52:17 
//     对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------

using IRaCIS.Core.Domain.Models;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Application.Helper;

namespace IRaCIS.Core.Application.Service
{
    /// <summary>
    /// TrialEmailNoticeConfigService
    /// </summary>	
    [ApiExplorerSettings(GroupName = "Test")]
    public class TrialEmailNoticeConfigService : BaseService, ITrialEmailNoticeConfigService
    {

        private readonly IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository;

        public TrialEmailNoticeConfigService(IRepository<TrialEmailNoticeConfig> trialEmailNoticeConfigRepository)
        {
            _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository;
        }


        /// <summary>
        /// 同步系统配置的文档到想项目中
        /// </summary>
        /// <param name="trialId"></param>
        /// <param name="criterionTypeEnum"></param>
        /// <returns></returns>
        /// 
        private async Task SyncSystemEmainCofigDocListAsync(Guid trialId, CriterionType? criterionTypeEnum)
        {
            if (criterionTypeEnum != null)
            {
                var docmentList = _repository.Where<CommonDocument>(t => t.CriterionTypeEnum == criterionTypeEnum).Select(t => new { t.Path, t.Name, t.Code, t.BusinessScenarioEnum }).ToList();

                var trialDocCount = _trialEmailNoticeConfigRepository.Where(t => t.CriterionTypeEnum == criterionTypeEnum).Count();

                if (trialDocCount == 0)
                {

                    foreach (var item in docmentList)
                    {
                        await _trialEmailNoticeConfigRepository.AddAsync(new TrialEmailNoticeConfig() { FileName = item.Name, FilePath = item.Path, BusinessScenarioEnum = item.BusinessScenarioEnum, Code = item.Code });
                    }

                }

            }

            await _trialEmailNoticeConfigRepository.SaveChangesAsync();
        }



        private async Task FillWordTemplate(Guid trialId, CriterionType criterionTypeEnum, CommonDocumentBusinessScenario businessScenarioEnum)
        {

           



        }


        private async Task <SMTPEmailConfig> FillWordTemplateAndEmailConfig(Guid trialId, Guid visitTaskId, Guid trialReadingCriterionId, CommonDocumentBusinessScenario businessScenarioEnum)
        {
            var criterionTypeEnum = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId && t.Id == trialReadingCriterionId).Select(t => t.CriterionType).FirstOrDefaultAsync();


            var emailConfig = await _trialEmailNoticeConfigRepository.Where(t => t.TrialId == trialId && t.CriterionTypeEnum == criterionTypeEnum && t.BusinessScenarioEnum == businessScenarioEnum).FirstOrDefaultAsync();

            if (emailConfig == null)
            {
                throw new BusinessValidationFailedException("找不到该项目标准场景下邮件的配置");
            }

            //填充邮件基本配置

            var sendEmailConfig = new SMTPEmailConfig();

            sendEmailConfig.TopicDescription = "入组确认测试";

            foreach (var item in emailConfig.ReceiveEmailList)
            {
                sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(string.Empty, item));
            }

            foreach (var item in emailConfig.CopyEmailList)
            {
                sendEmailConfig.CopyToMailAddressList.Add(new MimeKit.MailboxAddress(string.Empty, item));
            }


            //邮件内容html
            var pathToFile = _hostEnvironment.WebRootPath
                        + Path.DirectorySeparatorChar.ToString()
                        + "EmailTemplate"
                        + Path.DirectorySeparatorChar.ToString()
                        + "SubjectEnrollConfirm.html";

            using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
            {
                var templateInfo = SourceReader.ReadToEnd();


                sendEmailConfig.HtmlBodyStr = string.Format(templateInfo,
                    $" 附件为入组确认报告,请查收 "            
                    );
            }

            //邮件附件

            var path=  FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, emailConfig.FilePath);

            //sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
            //{
            //    FileName = emailConfig.FileName,
            //    FileStream =
            //});


            if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed)
            {

            }
            else if(businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed)
            {

            }

            return sendEmailConfig;

        }




        public async Task<List<TrialEmailNoticeConfigView>> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery)
        {

            await SyncSystemEmainCofigDocListAsync(inQuery.TrialId, inQuery.CriterionTypeEnum);

            var trialEmailNoticeConfigQueryable = _trialEmailNoticeConfigRepository
              .WhereIf(inQuery.CriterionTypeEnum != null, t => t.CriterionTypeEnum == inQuery.CriterionTypeEnum)
              .WhereIf(inQuery.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == inQuery.BusinessScenarioEnum)
              .ProjectTo<TrialEmailNoticeConfigView>(_mapper.ConfigurationProvider);

            return await trialEmailNoticeConfigQueryable.ToListAsync();
        }


        public async Task<IResponseOutput> AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig)
        {

            addOrEditTrialEmailNoticeConfig.ReceiveEmailsStr = String.Join('|', addOrEditTrialEmailNoticeConfig.ReceiveEmailList);
            addOrEditTrialEmailNoticeConfig.CopyEmailsStr = String.Join('|', addOrEditTrialEmailNoticeConfig.CopyEmailList);

            var entity = await _trialEmailNoticeConfigRepository.InsertOrUpdateAsync(addOrEditTrialEmailNoticeConfig, true);

            return ResponseOutput.Ok(entity.Id.ToString());

        }


        [HttpDelete("{trialEmailNoticeConfigId:guid}")]
        public async Task<IResponseOutput> DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId)
        {
            var success = await _trialEmailNoticeConfigRepository.DeleteFromQueryAsync(t => t.Id == trialEmailNoticeConfigId, true);
            return ResponseOutput.Ok();
        }


    }
}