package wechatimg

import (
	"bytes"
	"encoding/json"
	"errors"
	"io"
	"io/ioutil"
	"mime/multipart"
	"net/http"
	"os"
	"path/filepath"
	"time"
	"wechat-conf/utils"

	"github.com/astaxie/beego"
)

const (
	WechatUploadMediaAPI = "https://api.weixin.qq.com/cgi-bin/material/add_material"
)

var (
	HttpRequstTimeOut time.Duration
)

type MediaUpload struct {
	ErrCode   int    `json:"errcode"`
	ErrMgs    string `json:"errmsg"`
	Type      string `json:"type"`
	MediaID   string `json:"media_id"`
	CreatedAt string `json:"created_at"`
}

func init() {
	HttpRequstTimeOut, _ = time.ParseDuration("5s")
}

func UploaImage(token, imagePath string) (mediaid string, err error) {
	file, err := os.Open(imagePath)
	if err != nil {
		beego.Error(err)
		utils.LogError("上传图片失败:", err)
		return
	}
	defer file.Close()
	body := &bytes.Buffer{}
	writer := multipart.NewWriter(body)
	part, err := writer.CreateFormFile("media", filepath.Base(imagePath))
	if err != nil {
		beego.Error(err)
		utils.LogError("上传图片失败:", err)
		return
	}
	_, err = io.Copy(part, file)
	err = writer.Close()
	if err != nil {
		beego.Error(err)
		utils.LogError("上传图片失败:", err)
		return
	}

	req, err := http.NewRequest("POST", WechatUploadMediaAPI, body)
	req.Header.Add("Content-Type", writer.FormDataContentType())
	urlQuery := req.URL.Query()
	if err != nil {
		beego.Error(err)
		utils.LogError("上传图片失败:", err)
		return
	}
	urlQuery.Add("access_token", token)
	urlQuery.Add("type", "image")

	req.URL.RawQuery = urlQuery.Encode()
	client := http.Client{}
	res, err := client.Do(req)
	if err != nil {
		beego.Error(err)
		utils.LogError("上传图片失败:", err)
		return
	}
	defer res.Body.Close()
	jsonbody, _ := ioutil.ReadAll(res.Body)
	media := MediaUpload{}
	err = json.Unmarshal(jsonbody, &media)
	if err != nil {
		beego.Error(media.ErrMgs)
		utils.LogError("上传图片失败:", media.ErrMgs)
		return
	}
	if media.MediaID == "" {
		beego.Error(media.ErrMgs)
		err = errors.New(media.ErrMgs)
		utils.LogError("上传图片失败:", media.ErrMgs)
	}
	mediaid = media.MediaID
	return
}