package controllers

import (
	"errors"
	"strconv"
	"time"
	"wechat-conf/utils"

	"net/http"
	"net/url"
)

// FileUpload 文件上传
func (c *BaseController) FileUpload() {
	file, err := c.uploadFileToOSS("file")
	if err != nil {
		c.ResponseError(err, http.StatusInternalServerError)
	}

	c.ResponseJSON(map[string]interface{}{
		"url": file,
	})
}

func (c *BaseController) uploadFileToOSS(field string) (string, error) {
	aliConf, ok := c.Configer[AliYunConf]
	if !ok {
		return "", errors.New("没有找到阿里云相关配置")
	}

	endpoint := aliConf.String("oss::Endpoint")
	accessKeyID := aliConf.String("oss::AccessKeyId")
	accessKeySecret := aliConf.String("oss::AccessKeySecret")
	bucket := aliConf.String("oss::Bucket")

	aliCli, err := utils.GetOssClient(endpoint, accessKeyID, accessKeySecret)
	if err != nil {
		return "", err
	}

	fNameExtra := strconv.FormatInt(time.Now().Unix(), 10)

	fileURL, err := utils.UploadFileToBucket(aliCli, c.Ctx.Request, bucket, field, fNameExtra)
	if err != nil {
		return "", err
	}

	return fileURL, nil
}

// UploadBase64Image Upload base64-image to ali-oss
// @Title Upload image to ali-oss
// @Description 上传base64图片到阿里云
// @Param   UpImgStr     form    string  true        "图片控件name"
// @Success 200 { Url } 图片URL
// @Failure >300 error message
func (c *BaseController) UploadBase64Image() {
	base64Str, err := url.QueryUnescape(c.GetString("base64str"))
	if err != nil {
		c.ResponseError(utils.LogError("上传 Base64 图片失败", err))
	}

	imgURL, err := c.uploadStringToAliOSS(base64Str)
	if err != nil {
		c.ResponseError(err)
	}

	resp := map[string]interface{}{
		"url": imgURL,
	}

	c.ResponseJSON(resp)
}

// uploadStringToAliOSS 上传文件到阿里云
func (c *BaseController) uploadStringToAliOSS(fStr string) (string, error) {
	aliConf, ok := c.Configer[AliYunConf]
	if !ok {
		return "", errors.New("没有找到阿里云相关配置")
	}

	endpoint := aliConf.String("oss::Endpoint")
	accessKeyID := aliConf.String("oss::AccessKeyId")
	accessKeySecret := aliConf.String("oss::AccessKeySecret")
	bucket := aliConf.String("oss::Bucket")

	aliCli, err := utils.GetOssClient(endpoint, accessKeyID, accessKeySecret)
	if err != nil {
		return "", utils.LogError("配置阿里云客户端失败", err)
	}

	fileURL, err := utils.UploadStringToBucket(aliCli, bucket, fStr)
	if err != nil {
		return "", utils.LogError("上传文件到阿里云失败", err)
	}

	return fileURL, nil
}