using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Library;
using System.Web;
using System.Security.Cryptography;
using System.Text;
using Aliyun.OSS;
using LitJson;

// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace MySystem.Areas.Api.Controllers
{
    [Area("Api")]
    [Route("Api/[controller]/[action]")]
    public class PublicMethodController : BaseController
    {
        public PublicMethodController(IHttpContextAccessor accessor, ILogger<BaseController> logger, IOptions<Setting> setting) : base(accessor, logger, setting)
        {
        }

        #region 系统-上传图片
        public JsonResult UploadPhotoByBase64(string value)
        {
            try
            {
                value = value.Replace("data:image/png;base64,", "");
                string base64str = HttpUtility.UrlDecode(value).Replace(" ", "+");
                string dummyData = base64str.Replace("%", "").Replace(",", "").Replace(" ", "+");
                if (dummyData.Length % 4 > 0)
                {
                    dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
                }
                string Icon = function.base64StringToImage(dummyData, "/static/upload/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + "/", "MT" + function.MD5_16(Guid.NewGuid().ToString()) + ".png");
                return Json(new AppResultJson() { Status = "1", Info = "", Data = Icon });
            }
            catch (Exception ex)
            {
                function.WriteLog(DateTime.Now + ":" + ex.ToString(), "系统上传图片异常");
                return Json(new AppResultJson() { Status = "1", Info = "", Data = "" });
            }
        }
        #endregion

        
       #region 前端上传oss返回参数
        public JsonResult OssInfo(string value)
        {
            value = DesDecrypt(value);
            JsonData data = JsonMapper.ToObject(value);
            string dir = data["dir"].ToString(); //文件上传路径        
            if (string.IsNullOrEmpty(data["dir"].ToString()))
            {
                return Json(new AppResultJson() { Status = "1", Info = "文件上传路径不能为空" });
            }
            Dictionary<string, object> Obj = new Dictionary<string, object>();
            var OssUrl = OssHost;
            var AccessKeyId = OssKey;
            var AccessKeySecret = OssSecret;
            var endpoint = "https://" + OssEndpoint;

            // 构造OssClient实例。 endpoint 格式:https://oss-cn-beijing.aliyuncs.com
            var ossClient = new OssClient(endpoint, AccessKeyId, AccessKeySecret);
            var config = new PolicyConditions();
            config.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024L * 1024 * 1024 * 5);// 文件大小范围：单位byte
            config.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);
            var expire = DateTimeOffset.Now.AddMinutes(30);// 过期时间

            // 生成 Policy，并进行 Base64 编码
            var policy = ossClient.GeneratePostPolicy(expire.LocalDateTime, config);
            var policyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(policy));

            // 计算签名
            var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(AccessKeySecret));
            var bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(policyBase64));
            var Signature = Convert.ToBase64String(bytes);

            Obj.Add("OssUrl", OssUrl);
            Obj.Add("AccessKeyId", AccessKeyId);
            // Obj.Add("AccessKeySecret", AccessKeySecret);
            Obj.Add("Policy", policyBase64);
            Obj.Add("Expiration", expire);
            Obj.Add("Signature", Signature);
            Obj.Add("dir", dir);
            return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj });
        }
        #endregion

    }
}