using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.VisualBasic;
using NPOI.SS.Formula.Functions;
using Shentun.Peis.Models;
using Shentun.Peis.PatientRegisters;
using Shentun.Peis.Permissions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
namespace Shentun.Peis.ThirdPartyPublicInterfaces
{
    /// 
    /// 第三方公开接口
    /// 
    public class ThirdPartyPublicInterfaceAppService : ApplicationService
    {
        private readonly IRepository _patientRegisterRepository;
        private readonly IRepository _registerCheckRepository;
        private readonly IRepository _registerCheckAsbitemRepository;
        private readonly IRepository _registerCheckItemRepository;
        private readonly IRepository-  _itemRepository;
        private readonly IRepository _itemTypeRepository;
        private readonly IRepository _asbitemRepository;
        private readonly IRepository _patientRepository;
        private readonly CacheService _cacheService;
        public ThirdPartyPublicInterfaceAppService(
            IRepository patientRegisterRepository,
            CacheService cacheService,
            IRepository registerCheckRepository,
            IRepository registerCheckAsbitemRepository,
            IRepository registerCheckItemRepository,
            IRepository
-  itemRepository,
            IRepository itemTypeRepository,
            IRepository asbitemRepository,
            IRepository patientRepository)
        {
            _patientRegisterRepository = patientRegisterRepository;
            _cacheService = cacheService;
            _registerCheckRepository = registerCheckRepository;
            _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
            _registerCheckItemRepository = registerCheckItemRepository;
            _itemRepository = itemRepository;
            _itemTypeRepository = itemTypeRepository;
            _asbitemRepository = asbitemRepository;
            _patientRepository = patientRepository;
        }
        /// 
        /// 查询体检人员基本信息
        /// 
        /// 
        /// 
        [Authorize(PeisPermissions.Third.Default)]
        [HttpPost("api/Third/ThirdPartyPublicInterface/GetBasicInformationOfMedicalExaminationPersonnel")]
        public async Task GetBasicInformationOfMedicalExaminationPersonnelAsync(PublicPatientRegisterNoInputDto input)
        {
            if (input == null)
            {
                throw new UserFriendlyException($"请求参数错误");
            }
            var result = new BasicInformationOfMedicalExaminationPersonnelDto();
            var patientRegisterEnt = await _patientRegisterRepository.FirstOrDefaultAsync(m => m.PatientRegisterNo == input.PatientRegisterNo);
            if (patientRegisterEnt != null)
            {
                result = new BasicInformationOfMedicalExaminationPersonnelDto
                {
                    BirthDate = patientRegisterEnt.BirthDate != null ? patientRegisterEnt.BirthDate.Value.ToString("yyyy-MM-dd") : "",
                    PatientRegisterNo = patientRegisterEnt.PatientRegisterNo,
                    CompleteFlag = patientRegisterEnt.CompleteFlag,
                    IsMedicalStart = patientRegisterEnt.IsMedicalStart,
                    MedicalStartDate = patientRegisterEnt.MedicalStartDate != null ? patientRegisterEnt.MedicalStartDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
                    PatientName = patientRegisterEnt.PatientName,
                    SexName = _cacheService.GetSexNameAsync(patientRegisterEnt.SexId).Result,
                    SummaryDoctorName = _cacheService.GetSurnameAsync(patientRegisterEnt.SummaryDoctorId).Result,
                    SummaryDate = patientRegisterEnt.SummaryDate != null ? patientRegisterEnt.SummaryDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
                };
            }
            else
            {
                throw new UserFriendlyException($"条码号不正确");
            }
            return result;
        }
        /// 
        /// 查询体检明细项目信息
        /// 
        /// 
        /// 
        [Authorize(PeisPermissions.Third.Default)]
        [HttpPost("api/Third/ThirdPartyPublicInterface/GetPhysicalExaminationDetailsItemInformation")]
        public async Task
> GetPhysicalExaminationDetailsItemInformationAsync(PublicPatientRegisterNoInputDto input)
        {
            if (input == null)
            {
                throw new UserFriendlyException($"请求参数错误");
            }
            var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
                        join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
                        join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId
                        join item in await _itemRepository.GetQueryableAsync() on registerCheckItem.ItemId equals item.Id
                        join itemType in await _itemTypeRepository.GetQueryableAsync() on item.ItemTypeId equals itemType.Id into itemTypeTemp
                        from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
                        where patientRegister.PatientRegisterNo == input.PatientRegisterNo
                        select new
                        {
                            PatientRegisterNo = patientRegister.PatientRegisterNo,
                            registerCheckItem,
                            ItemName = item.DisplayName,
                            ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : ""
                        };
            if (query.Count() == 0)
            {
                throw new UserFriendlyException($"条码号不正确");
            }
            var entList = query.Select(s => new PhysicalExaminationDetailsItemInformationDto
            {
                ItemName = s.ItemName,
                ItemResult = s.registerCheckItem.Result,
                ItemTypeName = s.ItemTypeName,
                PatientRegisterNo = s.PatientRegisterNo,
                ReferenceRangeValue = s.registerCheckItem.ReferenceRangeValue,
                Unit = s.registerCheckItem.Unit
            }).ToList();
            return entList;
        }
        /// 
        /// 查询pacs条码信息
        /// 
        /// 
        /// 
        [HttpPost("api/Third/ThirdPartyPublicInterface/getPatientItems")]
        public async Task GetPatientPacsInfoAsync(PatientPacsInfoInputDto input)
        {
            if (input == null)
            {
                throw new UserFriendlyException($"请求参数错误");
            }
            if (string.IsNullOrEmpty(input.tjbh))
                throw new UserFriendlyException($"体检编号不能为空");
            var query = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
                         join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id into patientTemp
                         from patientHaveEmpty in patientTemp.DefaultIfEmpty()
                         join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
                         join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
                         join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id
                         join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id into itemTypeTemp
                         from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
                         where registerCheck.CheckRequestNo == input.tjbh
                         orderby asbitem.DisplayOrder ascending
                         select new
                         {
                             patientRegister,
                             IdNo = patientHaveEmpty != null ? patientHaveEmpty.IdNo : "",
                             MobileTelephone = patientHaveEmpty != null ? patientHaveEmpty.MobileTelephone : "",
                             CheckRequestNo = registerCheck.CheckRequestNo,
                             asbitem,
                             ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : "",
                             ItemTypeId = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.Id.ToString() : ""
                         }).ToList();
            if (!string.IsNullOrEmpty(input.xmlx))
            {
                //检查类型检索
            }
            if (query.Count == 0)
                throw new UserFriendlyException($"体检编号不存在");
            var patientInfo = new PatientPacsInfo_PatientInfoDto
            {
                addr = "",
                tjbh = query.FirstOrDefault().CheckRequestNo,
                csrq = query.FirstOrDefault().patientRegister.BirthDate != null ? query.FirstOrDefault().patientRegister.BirthDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
                djr = _cacheService.GetSurnameAsync(query.FirstOrDefault().patientRegister.CreatorId).Result,
                djrq = query.FirstOrDefault().patientRegister.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"),
                lxdh = query.FirstOrDefault().MobileTelephone,
                nl = query.FirstOrDefault().patientRegister.Age.ToString(),
                sfzh = query.FirstOrDefault().IdNo,
                tjrq = query.FirstOrDefault().patientRegister.MedicalStartDate != null ? query.FirstOrDefault().patientRegister.MedicalStartDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
                xb = query.FirstOrDefault().patientRegister.SexId == 'M' ? "1" : (query.FirstOrDefault().patientRegister.SexId == 'F' ? "2" : "9"),
                xm = query.FirstOrDefault().patientRegister.PatientName
            };
            var items = query.Select(s => new PatientPacsInfo_ItemsDto
            {
                ksbm = s.ItemTypeId,
                ksmc = s.ItemTypeName,
                sqdh = s.CheckRequestNo + "-" + (query.IndexOf(s) + 1),
                xmbh = s.asbitem.Id.ToString(),
                xmlx = "1",
                xmmc = s.asbitem.DisplayName,
            }).ToList();
            return new PatientPacsInfoDto
            {
                PatientInfo = patientInfo,
                Items = items
            };
        }
    }
}