using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.ViewModel;
namespace IRaCIS.Core.Application.Service.ReadingCalculate
{
    [ApiExplorerSettings(GroupName = "Image")]
    public class ReadingCalculateService: BaseService, IReadingCalculateService
    {
        /// 
        /// 标准和服务对应
        /// 
        Dictionary CalculateServiceDic = new Dictionary()
        {
            {CriterionType.RECIST1Pointt1,typeof(RECIST1Point1CalculateService) }, //RECIST1.1
            {CriterionType.PCWG3,typeof(PCWG3CalculateService) },
            {CriterionType.SelfDefine,typeof(SelfDefineCalculateService) }
        };
       
        private readonly IEnumerable _criterionServices;
        private readonly IRepository _visitTaskRepository;
        private readonly IRepository _readingQuestionCriterionTrialRepository;
        private  ICriterionCalculateService _useCriterion;
       
        public ReadingCalculateService(IEnumerable criterionServices,
                IRepository visitTaskRepository,
                  IRepository readingQuestionCriterionTrialRepository
            )
        {
            _criterionServices = criterionServices;
           this._visitTaskRepository = visitTaskRepository;
            this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
        }
        /// 
        /// 获取Service
        /// 
        /// 
        /// 
        public async Task GetService(Guid visitTaskId)
        {
            if (_useCriterion == null)
            {
                var criterionId = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(x => x.TrialReadingCriterionId).FirstNotNullAsync();
                var criterionType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == criterionId).Select(x => x.CriterionType).FirstOrDefaultAsync();
                if (criterionType == null)
                {
                    throw new BusinessValidationFailedException($"当前标准计算未开发好");
                }
                try
                {
                     CriterionType thisCriterionType = criterionType;
                    Type thisServiceType = CalculateServiceDic[thisCriterionType];
                    _useCriterion = _criterionServices.FirstOrDefault(x => x.GetType().Name == thisServiceType.Name + "Proxy");
                 
                }
                catch (Exception)
                {
                    _useCriterion = null;
                }
                return _useCriterion;
            }
            else
            {
                return _useCriterion;
            }
        }
        /// 
        /// 自动计算 并修改值
        /// 
        /// 
        /// 
        public async Task CalculateTask(CalculateTaskInDto inDto) 
        {
            var service = await this.GetService(inDto.VisitTaskId);
            if (service != null)
            {
                await service.CalculateTask(inDto);
            }
          
        }
        /// 
        /// 验证访视提交
        /// 
        /// 
        /// 
        public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
        {
            var service = await this.GetService(inDto.VisitTaskId);
            if (service != null)
            {
                await service.VerifyVisitTaskQuestions(inDto);
            }
           
        }
        /// 
        /// 将上一次的访视病灶添加到这一次
        /// 
        /// 
        /// 
        public async Task AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto)
        {
            var service = await this.GetService(inDto.VisitTaskId);
            if (service != null)
            {
                var readingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x=>x.ReadingTaskState).FirstNotNullAsync();
                var result= await service.AddTaskLesionAnswerFromLastTask(inDto);
            
                if (readingTaskState == ReadingTaskState.WaitReading)
                {
                   await service.CalculateTask(new CalculateTaskInDto()
                    {
                        IsChangeOtherTask = false,
                        VisitTaskId = inDto.VisitTaskId,
                    });
                    await  _visitTaskRepository.BatchUpdateNoTrackingAsync(x=>x.Id==inDto.VisitTaskId, x => new VisitTask()
                    {
                        ReadingTaskState = ReadingTaskState.Reading,
                    });
                   
                }
                return result;
            }
            else
            {
                return new AddTaskLesionAnswerFromLastTaskOutDto();
            }
           
        }
        /// 
        /// 获取报告验证的信息(这里每个标准可能不一样 返回用object)
        /// 
        /// 
        /// 
        public async Task