using Aliyun.OSS;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Infrastructure;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using NPOI.HPSF;
using SharpCompress.Common;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;

namespace IRaCIS.Core.Application.Helper
{
    public class MinIOOptions
    {
        public string endpoint { get; set; }
        public string port { get; set; }
        public bool useSSL { get; set; }
        public string accessKey { get; set; }
        public string secretKey { get; set; }
        public string bucketName { get; set; }
    }

    public class AliyunOSSOptions
    {
        public string regionId { get; set; }
        public string accessKeyId { get; set; }
        public string accessKeySecret { get; set; }
        public string endPoint { get; set; }
        public string bucketName { get; set; }

        public string roleArn { get; set; }

        public string region { get; set; }

        public string viewEndpoint { get; set; }

    }

    public class ObjectStoreServiceOptions
    {
        public string ObjectStoreUse { get; set; }
        public AliyunOSSOptions AliyunOSS { get; set; }
        public MinIOOptions MinIO { get; set; }

    }

    public class ObjectStoreDTO
    {
        public string ObjectStoreUse { get; set; }

        public AliyunOSSOptions AliyunOSS { get; set; }

        public MinIOOptions MinIO { get; set; }

    }

    public class AliyunOSSTempToken
    {
        public string AccessKeyId { get; set; }
        public string AccessKeySecret { get; set; }
        public string SecurityToken { get; set; }
        public string Expiration { get; set; }

        public string Region { get; set; }
        public string BucketName { get; set; }
        public string ViewEndpoint { get; set; }
    }



    public enum ObjectStoreUse
    {
        AliyunOSS = 0,
        MinIO = 1,
        AWS = 2,
    }






    public interface IOSSService
    {
        public string UploadToOSS(Stream fileStream, string oosFolderPath, string fileRealName);
        public string UploadToOSS(string localFilePath, string oosFolderPath);

        public void DownLoadFromOSS(string ossRelativePath, string localFilePath);


    }
    public class OSSService : IOSSService
    {

        public AliyunOSSOptions _OSSConfig { get; set; }

        public OssClient _ossClient { get; set; }



        public OSSService(IOptionsMonitor<ObjectStoreServiceOptions> options)
        {
            var ossOptions = options.CurrentValue;

            _OSSConfig = ossOptions.AliyunOSS;

            _ossClient = new OssClient(_OSSConfig.endPoint, _OSSConfig.accessKeyId, _OSSConfig.accessKeySecret);

        }

        /// <summary>
        /// oosFolderPath  不要 "/ "开头   应该: TempFolder/ChildFolder
        /// </summary>
        /// <param name="fileStream"></param>
        /// <param name="oosFolderPath"></param>
        /// <param name="fileRealName"></param>
        /// <returns></returns>
        /// <exception cref="BusinessValidationFailedException"></exception>
        public string UploadToOSS(Stream fileStream, string oosFolderPath,string fileRealName)
        {

            var ossRelativePath = oosFolderPath + "/" + fileRealName;

            try
            {
                using (var memoryStream = new MemoryStream())
                {
                    fileStream.Seek(0, SeekOrigin.Begin);

                    fileStream.CopyTo(memoryStream);

                    memoryStream.Seek(0, SeekOrigin.Begin);

                    // 上传文件
                    var result = _ossClient.PutObject(_OSSConfig.bucketName, ossRelativePath, memoryStream);
                }


                return "/" + ossRelativePath;
            }
            catch (Exception ex)
            {
                throw new BusinessValidationFailedException("oss上传失败" + ex.Message);

            }
        }

        /// <summary>
        /// oosFolderPath  不要 "/ "开头   应该: TempFolder/ChildFolder
        /// </summary>
        /// <param name="localFilePath"></param>
        /// <param name="oosFolderPath"></param>
        /// <returns></returns>
        /// <exception cref="BusinessValidationFailedException"></exception>
        public string UploadToOSS(string localFilePath, string oosFolderPath)
        {
            var localFileName = Path.GetFileName(localFilePath);

            var ossRelativePath = oosFolderPath + "/" + localFileName;


            try
            {
                // 上传文件
                var result = _ossClient.PutObject(_OSSConfig.bucketName, ossRelativePath, localFilePath);

                return ossRelativePath;
            }
            catch (Exception ex)
            {
                throw new BusinessValidationFailedException("oss上传失败" + ex.Message);

            }
        }

        public void DownLoadFromOSS(string ossRelativePath, string localFilePath)
        {
            try
            {
                var result = _ossClient.GetObject(_OSSConfig.bucketName, ossRelativePath);

                // 将下载的文件流保存到本地文件
                using (var fs = File.OpenWrite(localFilePath))
                {
                    result.Content.CopyTo(fs);
                    fs.Close();
                }
            }
            catch (Exception ex)
            {

                throw new BusinessValidationFailedException("oss下载失败!" + ex.Message);
            }


        }




    }


}