using IRaCIS.Core.Application.Contracts.Dicom;
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Models;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Dicom;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Authorization;

namespace IRaCIS.Core.Application.Services
{
    [ApiExplorerSettings(GroupName = "Image")]
    [AllowAnonymous]
    public class SeriesService : BaseService
    {
        private readonly IRepository<ImageLabel> _imageLabelRepository;
        private readonly IRepository<DicomSeries> _seriesRepository;
        private readonly IRepository<DicomInstance> _instanceRepository;
        private readonly IRepository<DicomStudy> _studyRepository;
        private readonly IRepository<KeyInstance> _keyInstanceRepository;
        private readonly DicomFileStoreHelper _dicomFileStoreHelper;
        public SeriesService(IRepository<DicomInstance> instanceRepository, IRepository<DicomStudy> studyRepository,
            IRepository<KeyInstance> keyInstanceRepository, DicomFileStoreHelper dicomFileStoreHelper, IRepository<DicomSeries> seriesRepository, IRepository<ImageLabel> imageLabelRepository)
        {
            _seriesRepository = seriesRepository;
            _dicomFileStoreHelper = dicomFileStoreHelper;
            _instanceRepository = instanceRepository;
            _studyRepository = studyRepository;
            _keyInstanceRepository = keyInstanceRepository;
            _imageLabelRepository = imageLabelRepository;
        }



        //医生读片那一块有耦合,关键序列   这里暂时留存
        /// <summary> 指定资源Id,获取Dicom检查所属序列信息列表 </summary>
        /// <param name="studyId"> Dicom检查的Id </param>
        /// <param name="tpCode"></param>
        [HttpGet, Route("{studyId:guid}/{tpCode?}")]
        public async Task<IResponseOutput<List<DicomSeriesWithLabelDTO>>> List(Guid studyId, string? tpCode)
        {

            var seriesList = await  _seriesRepository.Where(s => s.StudyId == studyId).OrderBy(s => s.SeriesNumber).
              ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
              .ProjectTo<DicomSeriesWithLabelDTO>(_mapper.ConfigurationProvider).ToListAsync();

            bool hasKeyInstance = false;
            var SeriesIdList = _imageLabelRepository.Where(u => u.TpCode == tpCode).Select(s => s.SeriesId).Distinct().ToList();
            var instanceIdList = _imageLabelRepository.Where(u => u.TpCode == tpCode).Select(s => s.InstanceId).Distinct().ToList();
            foreach (var item in seriesList)
            {
                if (SeriesIdList.Contains(item.Id))
                {
                    item.HasLabel = true;
                    hasKeyInstance = true;
                }
                else item.HasLabel = false;
            }
            if (hasKeyInstance)
            {
                seriesList.Add(new DicomSeriesWithLabelDTO
                {
                    KeySeries = true,
                    Id = SeriesIdList[0],
                    InstanceCount = instanceIdList.Count,
                    HasLabel = true,
                    Modality = seriesList[0].Modality,
                    Description = "Key Series"
                });
            }

            var idList = await _instanceRepository.Where(s => s.StudyId == studyId).ToListAsync();//.GroupBy(u => u.SeriesId);

            foreach (var item in seriesList)
            {
                if (item.KeySeries)
                {
                    item.InstanceList = instanceIdList;
                }
                else
                {
                    item.InstanceList = idList.Where(s => s.SeriesId == item.Id).OrderBy(t => t.InstanceNumber)
                        .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime).Select(u => u.Id).ToList();
                }
            }

            return ResponseOutput.Ok(seriesList);
        }





        /// <summary> 指定资源Id,渲染Dicom序列的Jpeg预览图像 </summary>
        /// <param name="seriesId"> Dicom序列的Id </param>
        [HttpGet, Route("{seriesId:guid}")]
        [AllowAnonymous]
        public async Task<FileContentResult> Preview(Guid seriesId)
        {
            string path = string.Empty;
            DicomInstance dicomInstance = await _instanceRepository.FirstOrDefaultAsync(s => s.SeriesId == seriesId).IfNullThrowException();

            DicomStudy dicomStudy = await _studyRepository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId).IfNullThrowException();

            path = _dicomFileStoreHelper.GetInstanceFilePath(dicomStudy, dicomInstance.SeriesId, dicomInstance.Id.ToString());

            using (var sw = DicomRenderingHelper.RenderPreviewJpeg(path))
            {
                var bytes = new byte[sw.Length];
                sw.Read(bytes, 0, bytes.Length);
                sw.Close();
                return new FileContentResult(bytes, "image/jpeg");
            }
        }


    }
}