using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Filter;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
using Microsoft.AspNetCore.Authorization;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Service.Reading.Dto;
using MassTransit;
using IRaCIS.Core.Application.Service.Reading;
using IRaCIS.Core.Infra.EFCore.Common;
using Panda.DynamicWebApi.Attributes;
using AutoMapper;
using IRaCIS.Core.Application.Contracts;
namespace IRaCIS.Application.Services
{
    /// 
    /// IR影像阅片
    /// 
    [ApiExplorerSettings(GroupName = "Reading")]
    public class ReadingImageTaskService : BaseService, IReadingImageTaskService
    {
        private readonly IMapper mapper;
        private readonly IRepository _noneDicomStudyRepository;
        private readonly IRepository _visitTaskRepository;
        private readonly IRepository _subjectVisitRepository;
        private readonly IRepository _readingTaskQuestionAnswerRepository;
        private readonly IRepository _readingQuestionCriterionTrialRepository;
        private readonly IRepository _readingQuestionTrialRepository;
        public ReadingImageTaskService(
                 IMapper mapper,
                 IRepository noneDicomStudyRepository,
                  IRepository visitTaskRepository,
                   IRepository subjectVisitRepository,
                 IRepository readingTaskQuestionAnswerRepository,
                  IRepository readingQuestionCriterionTrialRepository,
                  IRepository readingQuestionTrialRepository
          )
        {
            this.mapper = mapper;
            this._noneDicomStudyRepository = noneDicomStudyRepository;
            this._visitTaskRepository = visitTaskRepository;
            this._subjectVisitRepository = subjectVisitRepository;
            this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository;
            this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
            this._readingQuestionTrialRepository = readingQuestionTrialRepository;
        }
        /// 
        /// 获取下一个阅片任务
        /// 
        /// 
        /// 
        /// 
        private async Task GetNextTaskId(Guid? subjectId,Guid trialId)
        {
            GetReadingTaskDto? task = new GetReadingTaskDto();
            if (subjectId != null)
            {
                 task = await _visitTaskRepository.Where(x => x.TrialId == trialId && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.SubjectId == subjectId.Value).Select(x => new GetReadingTaskDto()
                {
                     VisistTaskId=x.Id,
                    ReadingCategory = x.ReadingCategory,
                    VisistId = x.ReadingCategory == ReadingCategory.Visit ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId,
                    VisitNum = x.ReadingCategory == ReadingCategory.Visit ? x.SubjectVisit.VisitNum : x.ReadModule.VisitNum
                }).OrderBy(x => x.VisitNum).ThenBy(x => x.ReadingCategory).FirstOrDefaultAsync();
                task.SubjectId = subjectId.Value;
            }
            else
            {
                task = await _visitTaskRepository.Where(x => x.TrialId == trialId && x.ReadingTaskState != ReadingTaskState.HaveSigned).Select(x => new GetReadingTaskDto()
                {
                    VisistTaskId = x.Id,
                    ReadingCategory = x.ReadingCategory,
                    VisistId = x.ReadingCategory == ReadingCategory.Visit ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId,
                    VisitNum = x.ReadingCategory == ReadingCategory.Visit ? x.SubjectVisit.VisitNum : x.ReadModule.VisitNum
                }).FirstOrDefaultAsync();
                task.SubjectId = await _subjectVisitRepository.Where(x => x.Id == task.VisistId).Select(x => x.SubjectId).FirstOrDefaultAsync();
            }
            return task;
        
          
        }
        /// 
        /// 获取阅片非Dicom文件
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task<(List,object)> GetReadingImageFile(GetReadingImgInDto inDto)
        {
            var task=await GetNextTaskId(inDto.SubjectId, inDto.TrialId);
            List visitIds = new List();
            if (task.ReadingCategory == ReadingCategory.Visit)
            {
                visitIds.Add(task.VisistId);
            }
            else
            {
                // 阅片期取前面所有的图像
                visitIds.AddRange(await _subjectVisitRepository.Where(x => x.VisitNum <= task.VisitNum && x.SubjectId == task.SubjectId).Select(x => x.Id).ToListAsync());
            }
            List result=await _noneDicomStudyRepository.Where(t => visitIds.Contains(t.SubjectVisitId))
                .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }).ToListAsync();
        
            return (result, new  { 
            VisitTaskId= task.VisistTaskId
            });
        }
        /// 
        /// 获取项目已确认的标准
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task> GetTrialConfirmCriterionList(GetConfirmCriterionInDto inDto)
        {
            var result= await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId&&x.IsConfirm&&x.IsCompleteConfig)
               .Select(x => new GetTrialConfirmCriterionListOutDto()
               {
                   ReadingQuestionCriterionTrialId = x.Id,
                   ReadingQuestionCriterionTrialName = x.CriterionName
               }).ToListAsync();
            return result;
        }
        /// 
        /// 获取项目的阅片问题
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task> GetTrialReadingQuestion(GetTrialReadingQuestionInDto inDto)
        {
            var qusetionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.ReadingQuestionCriterionTrialId).ToListAsync();
            List groupList = _mapper.Map>(qusetionList.Where(x => x.ParentId == null));
            groupList.ForEach(x =>
            {
                FindChildQuestion(x, qusetionList);
            });
            return groupList;
        }
        /// 
        /// 找子问题
        /// 
        /// 
        /// 
        private void FindChildQuestion(GetTrialReadingQuestionOutDto trialReadingQuestion, List questionlists)
        {
            trialReadingQuestion.Childrens = _mapper.Map>(questionlists.Where(x => x.ParentId == trialReadingQuestion.ReadingQuestionTrialId));
            if (trialReadingQuestion.Childrens != null && trialReadingQuestion.Childrens.Count != 0)
            {
                trialReadingQuestion.Childrens.ForEach(x =>
                {
                    FindChildQuestion(x, questionlists);
                });
            }
        }
        /// 
        /// 提交问题
        /// 
        /// 
        /// 
        [NonDynamicMethod]
        public async Task SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
        {
            var subjectId =await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.SubjectId).FirstOrDefaultAsync();
            List readingTaskAnswerList = inDto.AnswerList.Select(x => new ReadingTaskQuestionAnswer()
            {
                Id = NewId.NextGuid(),
                SubjectId = subjectId,
                Answer = x.Answer,
                ReadingQuestionCriterionTrialId = inDto.ReadingQuestionCriterionTrialId,
                ReadingQuestionTrialId = x.ReadingQuestionTrialId,
                VisitTaskId = inDto.VisitTaskId,
                TrialId = inDto.TrialId
            }).ToList();
            await _readingTaskQuestionAnswerRepository.AddRangeAsync(readingTaskAnswerList);
            await _visitTaskRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
            {
                ReadingTaskState = ReadingTaskState.HaveSigned
            });
            var result = await _visitTaskRepository.SaveChangesAsync();
            return ResponseOutput.Ok(result);
        }
    }
}