using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.BusinessFilter;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Image.QA;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.Service.Inspection.DTO;
using IRaCIS.Core.Application.Service.Inspection.Interface;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.Service.Reading.Interface;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace IRaCIS.Core.API.Controllers
{
    [ApiController, ApiExplorerSettings(GroupName = "Reviewer")]
    [UnitOfWork]
    public class InspectionController(
        ITrialDocumentService _trialDocumentService,
        IReadingImageTaskService _iReadingImageTaskService,
        ITrialConfigService _trialConfigService,
        IClinicalAnswerService _clinicalAnswerService,
        IReadingClinicalDataService _readingClinicalDataService,
        IQCOperationService _qCOperationService,
        IInspectionService _inspectionService,
        IReadingMedicalReviewService _readingMedicalReviewService,
        IReadingMedicineQuestionService _readingMedicineQuestionService
        ) : ControllerBase
    {
        #region 获取稽查数据
        /// 
        /// 获取稽查数据
        /// 
        /// 
        [HttpPost, Route("Inspection/GetInspectionList")]
        public async Task> GetInspectionList(GetDataInspectionDto dto)
        {
            return await _inspectionService.GetInspectionList(dto);
        }
        #endregion
        /// 
        /// 提交肿瘤学阅片任务
        /// 
        /// 
        ///  
        [HttpPost, Route("Inspection/ReadingImageTask/SubmitOncologyReadingInfo")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SetOncologyReadingInfo(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _iReadingImageTaskService.SubmitOncologyReadingInfo(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 提交Diocm阅片
        /// 
        /// 
        ///  
        [HttpPost, Route("Inspection/ReadingImageTask/SubmitDicomVisitTask")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SubmitDicomVisitTask(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _iReadingImageTaskService.SubmitDicomVisitTask(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 提交全局阅片任务
        /// 
        /// 
        ///  
        [HttpPost, Route("Inspection/ReadingImageTask/SubmitGlobalReadingInfo")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SubmitGlobalReadingInfo(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _iReadingImageTaskService.SubmitGlobalReadingInfo(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 项目阅片信息签名
        /// 
        /// 
        ///  
        [HttpPost, Route("Inspection/configTrialBasicInfo/TrialReadingInfoSign")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task TrialReadingInfoSign(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.TrialReadingInfoSign(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 医学审核完成
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ReadingMedicalReview/FinishMedicalReview")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task FinishMedicalReview(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _readingMedicalReviewService.FinishMedicalReview(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 确认项目医学审核问题
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ReadingMedicineQuestion/ConfirmReadingMedicineQuestion")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task ConfirmReadingMedicineQuestion(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _readingMedicineQuestionService.ConfirmReadingMedicineQuestion(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 提交阅片问题
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ReadingImageTask/SubmitVisitTaskQuestions")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SubmitVisitTaskQuestions(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _iReadingImageTaskService.SubmitVisitTaskQuestions(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// CRC签名临床数据
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ClinicalAnswer/CRCSignClinicalData")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task CRCSignClinicalData(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _clinicalAnswerService.CRCSignClinicalData(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// CRC确认临床数据
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ClinicalAnswer/CRCConfirmClinical")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task CRCConfirmClinical(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _clinicalAnswerService.CRCConfirmClinical(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// CRC撤销临床数据
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ClinicalAnswer/CRCCancelConfirmClinical")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task CRCCancelConfirmClinical(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _clinicalAnswerService.CRCCancelConfirmClinical(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// PM确认临床数据
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ClinicalAnswer/PMConfirmClinical")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task PMConfirmClinical(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _clinicalAnswerService.PMConfirmClinical(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// PM签名一致性分析临床数据
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ReadingClinicalData/SignConsistencyAnalysisReadingClinicalData")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SignConsistencyAnalysisReadingClinicalData(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _readingClinicalDataService.SignConsistencyAnalysisReadingClinicalData(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 提交结构化录入并签名
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ClinicalAnswer/SubmitClinicalFormAndSign")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SubmitClinicalFormAndSign(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _clinicalAnswerService.SubmitClinicalForm(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 提交阅片裁判问题
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ReadingImageTask/SubmitJudgeVisitTaskResult")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SubmitJudgeVisitTaskResult(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _iReadingImageTaskService.SubmitJudgeVisitTaskResult(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 配置 基础逻辑信息并确认
        /// 
        /// 
        ///  
        [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialBasicInfoConfirm")]
        [UnitOfWork]
        [TrialGlobalLimit( "BeforeOngoingCantOpt" )]
        public async Task ConfigTrialBasicInfoConfirm(DataInspectionDto opt)
        {
            opt.Data.IsTrialBasicLogicConfirmed = true;
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.ConfigTrialBasicInfo(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 配置流程并确认
        /// 
        /// 
        ///  
        [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialProcessInfoConfirm")]
        [UnitOfWork]
        //[TrialGlobalLimit( "BeforeOngoingCantOpt" )]
        public async Task ConfigTrialProcessInfoConfirm(DataInspectionDto opt)
        {
            opt.Data.IsTrialProcessConfirmed = true;
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.ConfigTrialProcessInfo(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 配置加急信息并确认
        /// 
        /// 
        ///  
        [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialUrgentInfoConfirm")]
        [UnitOfWork]
        [TrialGlobalLimit( "BeforeOngoingCantOpt" )]
        public async Task ConfigTrialUrgentInfoConfirm(DataInspectionDto opt)
        {
            opt.Data.IsTrialUrgentConfirmed = true;
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.ConfigTrialUrgentInfo(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialPACSInfoConfirm")]
        [UnitOfWork]
        [TrialGlobalLimit( "BeforeOngoingCantOpt" )]
        public async Task ConfigTrialPACSInfoConfirm(DataInspectionDto opt)
        {
            opt.Data.IsTrialPACSConfirmed = true;
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.ConfigTrialPACSInfo(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 签名确认
        /// 
        /// 
        [HttpPost, Route("Inspection/configTrialBasicInfo/TrialConfigSignatureConfirm")]
        [UnitOfWork]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        public async Task TrialConfigSignatureConfirm(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.TrialConfigSignatureConfirm(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 重置并同步项目阅片标准
        /// 
        /// 
        [HttpPost, Route("Inspection/ReadingCriterion/ResetAndAsyncCriterion")]
        [UnitOfWork]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        public async Task ResetAndAsyncCriterion(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.ResetAndAsyncCriterion(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// CRC RequestToQC  批量提交
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/QCOperation/CRCRequestToQC")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task CRCRequestToQC(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _qCOperationService.CRCRequestToQC(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 设置QC 通过或者不通过   7:QC failed  8:QC passed  
        /// 
        [HttpPost, Route("Inspection/QCOperation/QCPassedOrFailed")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task QCPassedOrFailed(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _qCOperationService.QCPassedOrFailed(opt.Data.trialId, opt.Data.subjectVisitId, opt.Data.auditState);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 一致性核查 回退  对话记录不清除  只允许PM回退
        /// 
        [HttpPost, Route("Inspection/QCOperation/CheckBack")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task CheckBack(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _qCOperationService.CheckBack(opt.Data.Id);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 影像阅片临床数据签名
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/ReadClinicalData/ReadClinicalDataSign")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task ReadClinicalDataSign(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _readingClinicalDataService.ReadClinicalDataSign(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// CRC  设置已经重传完成
        /// 
        [HttpPost, Route("Inspection/QCOperation/SetReuploadFinished")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task SetReuploadFinished(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _qCOperationService.SetReuploadFinished(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 更新项目状态
        /// 
        /// 
        /// 
        [HttpPost, Route("Inspection/TrialConfig/updateTrialState")]
        [TrialGlobalLimit( "BeforeOngoingCantOpt")]
        [UnitOfWork]
        public async Task UpdateTrialState(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _trialConfigService.UpdateTrialState(opt.Data.trialId, opt.Data.trialStatusStr, opt.Data.reason);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 用户 签名某个文档  
        /// 
        /// 
        [HttpPost, Route("Inspection/TrialDocument/userConfirm")]
        [TrialGlobalLimit( "BeforeOngoingCantOpt", "SignSystemDocNoTrialId", "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task UserConfirm(DataInspectionDto opt)
        {
            var singid = await _inspectionService.RecordSing(opt.SignInfo);
            opt.Data.SignText = opt.SignInfo.SignText;
            var result = await _trialDocumentService.UserConfirm(opt.Data);
            await _inspectionService.CompletedSign(singid, result);
            return result;
        }
        /// 
        /// 重阅同意
        /// 
        /// 
        [HttpPost, Route("Inspection/VisitTask/ConfirmReReading")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        [UnitOfWork]
        public async Task ConfirmReReading(DataInspectionDto opt,  [FromServices] IVisitTaskService _visitTaskService)
        {
            var singId = await _inspectionService.RecordSing(opt.SignInfo);
            var result = await _visitTaskService.ConfirmReReading(opt.Data);
            await _inspectionService.CompletedSign(singId, result);
            return result;
        }
    }
}