using System.IO;
using System.Threading.Tasks;
using API.Data;
using API.Entities.Enums;
using API.Extensions;
using API.Services;
using Microsoft.AspNetCore.Mvc;
namespace API.Controllers
{
    /// 
    /// Responsible for servicing up images stored in the DB
    /// 
    public class ImageController : BaseApiController
    {
        private readonly IUnitOfWork _unitOfWork;
        private readonly IDirectoryService _directoryService;
        /// 
        public ImageController(IUnitOfWork unitOfWork, IDirectoryService directoryService)
        {
            _unitOfWork = unitOfWork;
            _directoryService = directoryService;
        }
        /// 
        /// Returns cover image for Chapter
        /// 
        /// 
        /// 
        [HttpGet("chapter-cover")]
        public async Task GetChapterCoverImage(int chapterId)
        {
            var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.ChapterRepository.GetChapterCoverImageAsync(chapterId));
            if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image");
            var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", "");
            Response.AddCacheHeader(path);
            return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path));
        }
        /// 
        /// Returns cover image for Volume
        /// 
        /// 
        /// 
        [HttpGet("volume-cover")]
        public async Task GetVolumeCoverImage(int volumeId)
        {
            var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.VolumeRepository.GetVolumeCoverImageAsync(volumeId));
            if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image");
            var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", "");
            Response.AddCacheHeader(path);
            return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path));
        }
        /// 
        /// Returns cover image for Series
        /// 
        /// Id of Series
        /// 
        [HttpGet("series-cover")]
        public async Task GetSeriesCoverImage(int seriesId)
        {
            var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.SeriesRepository.GetSeriesCoverImageAsync(seriesId));
            if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image");
            var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", "");
            Response.AddCacheHeader(path);
            return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path));
        }
        /// 
        /// Returns cover image for Collection Tag
        /// 
        /// 
        /// 
        [HttpGet("collection-cover")]
        public async Task GetCollectionCoverImage(int collectionTagId)
        {
            var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.CollectionTagRepository.GetCoverImageAsync(collectionTagId));
            if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image");
            var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", "");
            Response.AddCacheHeader(path);
            return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path));
        }
        /// 
        /// Returns image for a given bookmark page
        /// 
        /// This request is served unauthenticated, but user must be passed via api key to validate
        /// 
        /// Starts at 0
        /// API Key for user. Needed to authenticate request
        /// 
        [HttpGet("bookmark")]
        public async Task GetBookmarkImage(int chapterId, int pageNum, string apiKey)
        {
            var userId = await _unitOfWork.UserRepository.GetUserIdByApiKeyAsync(apiKey);
            var bookmark = await _unitOfWork.UserRepository.GetBookmarkForPage(pageNum, chapterId, userId);
            if (bookmark == null) return BadRequest("Bookmark does not exist");
            var bookmarkDirectory =
                (await _unitOfWork.SettingsRepository.GetSettingAsync(ServerSettingKey.BookmarkDirectory)).Value;
            var file = new FileInfo(Path.Join(bookmarkDirectory, bookmark.FileName));
            var format = Path.GetExtension(file.FullName).Replace(".", "");
            return PhysicalFile(file.FullName, "image/" + format, Path.GetFileName(file.FullName));
        }
    }
}