using IRaCIS.Core.Application.Contracts.Dicom;
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Application.Dicom;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

namespace IRaCIS.Api.Controllers
{
    /// <summary>
    /// Instance 
    /// </summary>
    [Route("instance")]
    [ApiController, Authorize, ApiExplorerSettings(GroupName = "Image")]
    public class InstanceController : ControllerBase
    {
        private readonly IDicomArchiveService _dicomArchiveService;
        public InstanceController(IDicomArchiveService dicomArchiveService)
        {
            _dicomArchiveService = dicomArchiveService;
        }

        /// <summary> 指定资源Id,获取Dicom序列所属的实例信息列表 </summary>
        /// <param name="seriesId"> Dicom序列的Id </param>
        [HttpGet, Route("list/{seriesId:guid}")]
        public IEnumerable<DicomInstanceDTO> GetInstanceList(Guid seriesId)
        {
            return _dicomArchiveService.GetInstanceList(seriesId);
        }

        /// <summary> 指定资源Id,获取Dicom序列所属的实例Id列表 </summary>
        /// <param name="seriesId"> Dicom序列的Id </param>
        /// <param name="tpCode"></param>
        /// <param name="key"></param>
        [HttpGet, Route("list/id/{seriesId:guid}/{tpCode?}/{key?}")]
        public IEnumerable<Guid> GetInstanceIdList(Guid seriesId, string tpCode, bool? key)
        {
            return _dicomArchiveService.GetInstanceIdList(seriesId, tpCode, key);
        }

        /// <summary> 指定资源Id,渲染Dicom实例的Jpeg预览图像 </summary>
        /// <param name="instanceId"> Dicom实例的Id </param>
        [HttpGet, Route("preview/{instanceId:guid}")]
        [AllowAnonymous]
        public FileContentResult GetInstancePreview(Guid instanceId)
        {
            string path = _dicomArchiveService.GetInstancePreview(instanceId);
            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");
            }
        }

        /// <summary> 指定资源Id,获取Dicom实例文件的内容 </summary>
        /// <param name="instanceId"> Dicom实例的Id </param>
        [HttpGet, Route("content/{instanceId:guid}")]
        [AllowAnonymous]
        public FileContentResult GetInstanceContent(Guid instanceId)
        {
            var filePath = _dicomArchiveService.GetInstanceContent(instanceId);
            using (var sw = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                var bytes = new byte[sw.Length];
                sw.Read(bytes, 0, bytes.Length);
                sw.Close();
                return new FileContentResult(bytes, "application/octet-stream");
            }
        }

    }
}