using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Panda.DynamicWebApi.Attributes;
namespace IRaCIS.Core.Application.Service
{
    /// 
    /// 阅片问题.标准
    /// 
    [ApiExplorerSettings(GroupName = "Reading")]
    public class ReadingQuestionService(IRepository _subjectVisitRepository,
        IRepository _readingQuestionCriterionSystemRepository,
        IRepository _readingQuestionCriterionTrialRepository,
        IRepository _readingQuestionSystemRepository,
        IRepository _readingQuestionTrialRepository,
        IRepository _clinicalDataTrialSetRepository,
        IRepository _clinicalDataSystemSetRepository,
        IRepository _dictionaryRepository,
        IReadingImageTaskService _iReadingImageTaskService,
        IRepository _readingCriterionDictionaryRepository,
        IRepository _readingTableQuestionTrialRepository,
        IRepository _readingCriterionPageRepository,
        IRepository _trialRepository,
        IRepository _tumorAssessmentRepository,
        IRepository _organInfoRepository,
        IRepository _readingTableQuestionSystemRepository,
        IRepository _readingTaskQuestionAnswer,
        IRepository _previousPDFRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IReadingQuestionService
    {
        #region 获取计算问题
        ///// 
        ///// 获取自定义问题预览
        ///// 
        ///// 
        //[HttpPost]
        //public async Task<(List,bool)> GetCustomQuestionPreview(GetCustomQuestionPreviewInDto inDto)
        //{
        //   return (await _iReadingImageTaskService.GetReadingQuestion(inDto.TrialReadingCriterionId, null),true);
        //}
        /// 
        /// 设置项目问题导出
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task SetTrialQuestionExportResult(SetTrialQuestionExportResultInDto inDto)
        {
            List needAdd = new List()
            {
            };
            if (inDto.ExportType == ExportType.Basic)
            {
                needAdd = new List()
                {
                    ExportResult.DetailedTableOfAdjudicationResults,
                    ExportResult.DetailedTableOfIntraReaderAnalysisResults,
                    ExportResult.DetailedTableOfInterReaderAnalysisResults
                };
            }
            foreach (var item in inDto.QuestionList) 
             {
                item.ExportResult= item.ExportResult.Except(needAdd).ToList();
                if (item.ExportResult.Contains(ExportResult.TableOfAssessmentResults))
                {
                    item.ExportResult.AddRange(needAdd);
                }
                var ExportResultStr=JsonConvert.SerializeObject(item.ExportResult);
                await _readingQuestionTrialRepository.UpdatePartialFromQueryAsync(x => x.Id == item.QuestionId, x => new ReadingQuestionTrial()
                {
                    ExportResultStr = ExportResultStr,
                    CDISCCode = item.CDISCCode,
                });
            }
            foreach (var item in inDto.TableQuestionList)
            {
                item.ExportResult = item.ExportResult.Except(needAdd).ToList();
                if (item.ExportResult.Contains(ExportResult.TableOfAssessmentResults))
                {
                    item.ExportResult.AddRange(needAdd);
                }
                var ExportResultStr = JsonConvert.SerializeObject(item.ExportResult);
                await _readingTableQuestionTrialRepository.UpdatePartialFromQueryAsync(x => x.Id == item.TableQuestionId, x => new ReadingTableQuestionTrial()
                {
                    ExportResultStr = ExportResultStr,
                    CDISCCode = item.CDISCCode,
                });
            }
            return   await _readingTableQuestionTrialRepository.SaveChangesAsync();
        }
        /// 
        /// 获取项目的导出信息
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task GetTrialQuestionExportResult(GetTrialQuestionExportResultInDto inDto)
        {
            var questionList = await _readingQuestionTrialRepository.Where(x => x.Type != ReadingQestionType.Group && x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId)
                .OrderBy(x => x.ShowOrder).Select(x => new TrialQuestionExport()
                {
                    QuestionId = x.Id,
                    QuestionName = _userInfo.IsEn_Us ? x.QuestionEnName : x.QuestionName,
                    ExportResult = x.ExportResult,
                    ShowOrder = x.ShowOrder,
                    CDISCCode = x.CDISCCode,
                }).ToListAsync();
            var questionid = questionList.Select(x => x.QuestionId).ToList();
            var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => questionid.Contains(x.ReadingQuestionId))
               .OrderBy(x => x.ShowOrder).Select(x => new TrialQuestionExport()
               {
                   QuestionId = x.ReadingQuestionId,
                   TableQuestionId = x.Id,
                   QuestionName = _userInfo.IsEn_Us ? x.QuestionEnName : x.QuestionName,
                   ExportResult = x.ExportResult,
                   ShowOrder = x.ShowOrder,
                   CDISCCode = x.CDISCCode,
               }).ToListAsync();
            questionList.ForEach(x =>
            {
                x.Children = tableQuestionList.Where(y => y.QuestionId == x.QuestionId).OrderBy(y => y.ShowOrder).ToList();
            });
            List dicCode = new List() { "1","2"};
            if (inDto.ExportType == ExportType.CDISC)
            {
                dicCode = new List() { "8" };
            }
            var dicList = await _dictionaryRepository.Where(x => x.Parent.Code == "ExportResult")
                .Where(x=> dicCode.Contains(x.Code))
                .OrderBy(x => x.ShowOrder)
                .Select(x => new TrialQuestionExportDic()
                {
                    Code = int.Parse(x.Code),
                    Value = _userInfo.IsEn_Us ? x.Value : x.ValueCN,
                    ValueCN = _userInfo.IsEn_Us ? x.Value : x.ValueCN,
                }).ToListAsync();
            return new GetTrialQuestionExportResultOutDto()
            {
                DicList = dicList,
                QuestionList = questionList
            };
        }
        /// 
        /// 获取自定义表格问题预览
        /// 
        /// 
        [HttpPost]
        public async Task<(GetReadingTableQuestionOutDto, bool)> GetCustomTableQuestionPreview(GetCustomQuestionPreviewInDto inDto)
        {
            List tableAnswers = new List();
            List tableAnsweRowInfos = new List();
            return (await _iReadingImageTaskService.GetReadingTableQuestion(
                new GetReadingTableQuestionOrAnswerInDto()
                {
                    TrialReadingCriterionId = inDto.TrialReadingCriterionId,
                    TableAnswers = tableAnswers,
                    TableAnsweRowInfos = tableAnsweRowInfos,
                    IsGetallQuestion = true,
                    IsGetPreview = true
                }
               ), true);
        }
        public async Task