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
{
    [ApiExplorerSettings(GroupName = "Reading")]
    public class ReadModuleService : BaseService
    {

        public IRepository<SubjectVisit> _subjectVisitRepository;
        public ReadModuleService(IRepository<SubjectVisit> subjectVisitRepository
          )
        {
            _subjectVisitRepository = subjectVisitRepository;
        }


        /// <summary>
        /// 添加或更新项目医生项目价格
        /// </summary>
        [HttpPost]
        public async Task<List<GetReadModuleDtoOut>> GetReadModule(GetReadModuleDto dto)
        {
            var visits = await _subjectVisitRepository.Where(x => x.TrialId == dto.TrialId).Include(x=>x.Subject).Include(x => x.Site)
                .Select(x=>new GetReadModuleOutDto ()
                { 
                    CreateTime=x.CreateTime,
                    Id=x.Id,
                    SubjectId=x.SubjectId,
                    SubjectVisitId=x.Id,
                    IsUrgent=x.IsUrgent,
                    ModuleName= x.InPlan?"计划内访视":"计划外访视",
                    ModuleType= x.InPlan? ModuleTypeEnum.InPlanSubjectVisit: ModuleTypeEnum.OutPlanSubjectVisit,
                    SubjectCode=x.Subject.Code,
                    SiteCode=x.Site.SiteCode,
                    SiteId=x.Site.Id,
                }).ToListAsync();

            var data = visits.GroupBy(x => new { x.SiteId, x.SubjectId, x.SiteCode, x.SubjectCode }).Select(x => new GetReadModuleDtoOut()
            {

                SiteCode = x.Key.SiteCode,
                SiteId = x.Key.SiteId,
                SubjectCode = x.Key.SubjectCode,
                SubjectId = x.Key.SubjectId,
                Data = x.ToList().OrderBy(y => y.ModuleType).ToList(),
            }).ToList();

            return data;
        }



       
     

    }
}