using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using CoviDok.Api;
using CoviDok.Api.Request;
using CoviDok.BLL;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using NCuid;

namespace CoviDok.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ImagesController : ControllerBase
    {
        private MinioHandler MinioHandler = new MinioHandler(
            "minio:9000",
            "secretaccesskey",
            "secretsecretkey");
        private readonly string BucketName = "test1";

        private static Stream MakeStream(string s)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.Write(s);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }

        [HttpPost("Upload")]
        public async Task<GenericResponse> OnPostImage(ImagePost post)
        {
            GenericResponse response = new GenericResponse();
            if (post.SessionID != "a")
            {
                response.Status = Status.Error;
                response.Body["reason"] = "unauthorized";
                return response;
            }           
            
            MinioResult Result = await MinioHandler.UploadImage(BucketName, MakeStream(post.File), post.File.Length, Cuid.Generate());
            if (!Result.Success) response.Status = Status.Error;
            response.Body["reason"] = Result.Data;

            return response;
        }

        [HttpPost("Download")]
        public async Task<GenericResponse> OnGetImage(ImageGet imageGet)
        {
            GenericResponse gr = new GenericResponse();
            string[] attrs = imageGet.ImageID.Split(":");
            if (attrs.Length != 2) {
                gr.Status = Status.Error;
                gr.Body["reason"] = "Bad image ID!";
                return gr;
            }
            
            string res = null; ;
            await MinioHandler.GetImage(imageGet.ImageID, (stream) => {
                StreamReader reader = new StreamReader(stream);
                res = reader.ReadToEnd();
            });
            
            gr.Body["image"] = res;
            return gr;
        }
    }
}