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 IRaCIS.Core.Domain.Share.Reading;

namespace IRaCIS.Application.Services
{
    /// <summary>
    /// 生成的阅片模块(在大列表上展示的)
    /// </summary>
    [ApiExplorerSettings(GroupName = "Reading")]
    public class ReadModuleService : BaseService
    {

        public IRepository<SubjectVisit> _subjectVisitRepository;
        private readonly IRepository<Subject> _subjectRepository;
        private readonly IRepository<ReadModule> _readModuleRepository;


        public ReadModuleService(IRepository<SubjectVisit> subjectVisitRepository,
            IRepository<Subject> subjectRepository,
              IRepository<ReadModule> readModuleRepository
          )
        {
            _subjectVisitRepository = subjectVisitRepository;
            this._subjectRepository = subjectRepository;
            this._readModuleRepository = readModuleRepository;
        }


        /// <summary>
        ///  获取读片模块
        /// </summary>
        [HttpPost]
        public async Task<(PageOutput<GetReadModuleDtoOut>,object)> GetReadModule(GetReadModuleDto dto)
        {
            var subjectquery =  _subjectRepository.WhereIf(dto.TrialId!=null, x => x.TrialId == dto.TrialId).Include(x => x.SubjectVisitList).Include(x=>x.Site)
               .Select(x => new GetReadModuleDtoOut
               {
                   SiteCode = x.Site.SiteCode,
                   SiteId = x.SiteId,
                   SubjectCode = x.Code,
                   SubjectId = x.Id,
                   Data=x.SubjectVisitList.OrderBy(y=>y.InPlan).Select(y=>new GetReadModuleOutDto()
                   {
                       Id = y.Id,  //id
                       ModuleType = y.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit, // 模块类型
                       IsUrgent = x.IsUrgent, // 是否加急
                       SubjectVisitId = y.Id, // 访视ID
                       SubjectVisitName=y.VisitName, //  访视名称
                       Status= y.SubmitState== SubmitStateEnum.None|| y.SubmitState== SubmitStateEnum.ToSubmit? ReadModuleEnum.ImageUpload: ReadModuleEnum.ImageUpload, // 访视模块
                       CreateTime = y.CreateTime, // 创建时间
                       SubjectCode = y.Subject.Code, // 受试者code
                       SiteCode = x.Site.SiteCode, // 中心Code
                       IsFinalVisit=y.IsFinalVisit, // 是否为末次评估
                       OutPlanPreviousVisitId = y.OutPlanPreviousVisitId, // 上一访视
                       OutPlanPreviousVisitName = y.OutPlanPreviousVisit.VisitName, // 上一访视名称
                       SiteId = x.Site.Id,  // 中心ID
                       IsVisit=true,  // 是否为访视
                       PDState = y.PDState, // PD 进展
                       IsEnrollmentConfirm=y.IsEnrollmentConfirm, // 
                       SubjectId = x.Id,
                   }).ToList()
               });

            var pageList = await subjectquery.ToPagedListAsync(dto.PageIndex, dto.PageSize, dto.SortField == null|| dto.SortField==string.Empty ? "SiteCode" : dto.SortField,
                dto.Asc);

            var subjectisd = pageList.CurrentPageData.Select(x => x.SubjectId).ToList();

            var readModules =await _readModuleRepository.Where(x => subjectisd.Contains(x.SubjectId)).ToListAsync();

            pageList.CurrentPageData.ForEach(x => {

                x.Data.AddRange(readModules.Where(y => y.SubjectId == x.SubjectId).Select(
                    y => new GetReadModuleOutDto()
                    {
                        CreateTime = y.CreateTime,
                        Id = y.Id,
                        SubjectId=x.SubjectId,
                        ModuleType=y.ModuleType,
                    }));
            });

            return (pageList, new
            {
                MaxLength = pageList.CurrentPageData.ToList().Max(x => x.Data.Count)
            });
        }


        /// <summary>
        /// 新增或者修改
        /// </summary>
        /// <param name="addOrEditReadModule"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> AddOrUpdateReadModuleService(ReadModuleAddOrEdit addOrEditReadModule)
        {
            var entity = await _repository.InsertOrUpdateAsync<ReadModule, ReadModuleAddOrEdit>(addOrEditReadModule, true);
            return ResponseOutput.Ok(entity.Id.ToString());
        }



        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="readModuleId"></param>
        /// <returns></returns>
        [HttpDelete("{readModuleId:guid}")]
        public async Task<IResponseOutput> DeleteReadModule(Guid readModuleId)
        {
            var success = await _readModuleRepository.DeleteFromQueryAsync(t => t.Id == readModuleId, true);
            return ResponseOutput.Result(true);
        }


    }
}