using AutoMapper;
using EntityFrameworkCore.Triggered;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.Extensions.Localization;
namespace IRaCIS.Core.Application.Triggers
{
    /// 
    /// 添加访视计划  要给改项目下的所有Subject 添加该访视
    /// 
    public class SubjectTrigger(
         IStringLocalizer _localizer,
         IRepository _subjectVisitRepository,
         IRepository _visitStageRepository,
         IRepository _trialRepository,
         IMapper _mapper) : IBeforeSaveTrigger, IAfterSaveTrigger
    {
        /// 
        /// 手动设置出组状态
        /// 
        /// 
        /// 
        /// 
        /// 
        public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken)
        {
            if (context.ChangeType == ChangeType.Modified)
            {
                var dbSubject = context.Entity;
                //Site变更
                if (context.Entity.TrialSiteId != context.UnmodifiedEntity?.TrialSiteId)
                {
                    var subjectId = context.Entity.Id;
                    var trialSiteId = context.Entity.TrialSiteId;
                    await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { TrialSiteId = trialSiteId });
                    #region 废弃
                    ////如果访视结束了   需要删除计划外未执行的访视
                    //if (mapedSubject.Status == SubjectStatus.EndOfVisit)
                    //{
                    //    await _repository.DeleteFromQueryAsync(t => t.VisitExecuted == VisitExecutedEnum.UnExecuted && t.SubjectId == mapedSubject.Id && t.InPlan == false);
                    //}
                    ////如果是出组了  将受试者未执行的 设置为不可用
                    //if (mapedSubject.Status == SubjectStatus.OutOfEnrollment)
                    //{
                    //    await _repository.UpdateFromQueryAsync(t => t.SubjectId == mapedSubject.Id && t.VisitExecuted == VisitExecutedEnum.UnExecuted, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable });
                    //}
                    #endregion
                }
                // 出组  状态发生了变更
                if (context.Entity.Status == SubjectStatus.OutOfVisit && context.Entity.Status != context.UnmodifiedEntity?.Status)
                {
                    if (context.Entity.FinalSubjectVisitId != null)
                    {
                        if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == dbSubject.Id && t.IsFinalVisit && t.Id != dbSubject.FinalSubjectVisitId))
                        {
                            throw new BusinessValidationFailedException(
                                //---该受试者已经有访视被设置为末次访视,不允许将当前访视设置为末次访视。
                                _localizer["SubjectState_CannotSetCurrentAsLastVisit"]);
                        }
                        var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == dbSubject.FinalSubjectVisitId).IfNullThrowException();
                        if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum && t.SubmitState == SubmitStateEnum.ToSubmit))
                        {
                            throw new BusinessValidationFailedException(
                                //---该受试者当前访视后有访视的影像已上传,当前访视不允许设置为末次访视。
                                _localizer["SubjectState_CannotSetAsLastVisitWithImage"]);
                        }
                        sv.IsFinalVisit = true;
                        await _subjectVisitRepository.SaveChangesAsync();
                        //末次访视后的  访视设置为不可用
                        await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable });
                    }
                }
            }
        }
        public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken)
        {
            var subject = context.Entity;
            if (context.ChangeType == ChangeType.Added)
            {
                //添加受试者的时候,获取访视计划列表,添加到受试者访视表。
                var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == subject.TrialId && t.IsConfirmed).ToListAsync();
                var svList = _mapper.Map>(visitPlanList);
                var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == subject.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync();
                svList.ForEach(t =>
                {
                    t.Subject = subject;
                    t.SubjectId = subject.Id;
                    t.TrialId = subject.TrialId;
                    t.TrialSiteId = subject.TrialSiteId;
                    t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false;
                    t.Id = NewId.NextGuid();
                });
                await _subjectVisitRepository.AddRangeAsync(svList);
            }
        }
    }
}