package services

import (
	"encoding/json"
	"errors"
	"fmt"
	"hongze/hongze_cygx/models"
	"hongze/hongze_cygx/utils"
	"io/ioutil"
	"net/http"
	"strconv"
	"strings"
)

var (
	ServerUrl                = "http://127.0.0.1:5008/"
	Cygx_activity_sigin_html = "cygx_activity_sigin_html"
	Cygx_mp3_html            = "cygx_mp3_html"
	Cygx_mp4_html            = "cygx_mp4_html"
)

type Html2ImgResp struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Data string `json:"data"`
}

// postHtml2Img 请求htm2img接口
func postHtml2Img(param map[string]interface{}) (resp *Html2ImgResp, err error) {
	// 目前仅此处调用该接口，暂不加授权、校验等
	postUrl := ServerUrl + "htm2img"
	postData, err := json.Marshal(param)
	if err != nil {
		return
	}
	result, err := Html2ImgHttpPost(postUrl, string(postData), "application/json")
	if err != nil {
		return
	}
	if err = json.Unmarshal(result, &resp); err != nil {
		return
	}
	return resp, nil
}

// Html2ImgHttpPost post请求
func Html2ImgHttpPost(url, postData string, params ...string) ([]byte, error) {
	body := ioutil.NopCloser(strings.NewReader(postData))
	client := &http.Client{}
	req, err := http.NewRequest("POST", url, body)
	if err != nil {
		return nil, err
	}
	contentType := "application/x-www-form-urlencoded;charset=utf-8"
	if len(params) > 0 && params[0] != "" {
		contentType = params[0]
	}
	req.Header.Set("Content-Type", contentType)
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	fmt.Println("HttpPost:" + string(b))
	return b, err
}

//func init() {
//MakeYanxuanSpecialMomentsImg(185)
//var condition string
//var pars []interface{}
//condition += ` AND a.status = 3 `
//
//list, err := models.GetYanxuanSpecialList(0, condition, pars, 0, 999)
//fmt.Println(err)
//for _, v := range list {
//	MakeYanxuanSpecialMomentsImg(v.Id)
//}

//GetYanxuanSpecialAuthoListMomentsImg()
//}

// 生成研选专栏分享到朋友圈的图片
func MakeYanxuanSpecialMomentsImg(specialId int) (imgUrl string) {
	var err error
	//time.Sleep(3*time.Second) // 有时候同时添加多个活动，延迟三秒
	defer func() {
		if err != nil {
			fmt.Println("err：", err)
			go utils.SendAlarmMsg("生成研选专栏分享到朋友圈的图片，MakeYanxuanSpecialMomentsImg Err："+err.Error()+"专栏ID"+strconv.Itoa(specialId), 3)
		}
	}()
	detail, e := models.GetYanxuanSpecialById(specialId, 0)
	if e != nil {
		err = errors.New("GetYanxuanSpecialById, Err: " + e.Error())
		return
	}
	go GetYanxuanSpecialAuthoListMomentsImg() //有专栏生成的时候，最新专栏列表封面图
	configCode := "yanxuan_special_moments_img_html"
	detailConfig, e := models.GetConfigByCode(configCode)
	if e != nil {
		err = errors.New("GetCygxConfigDetailByCode 获取生成研选专栏分享到朋友圈的图片格式信息失败, Err: " + e.Error())
		return
	}
	var typeName, content string
	if detail.Type == 1 {
		typeName = "笔记"
	} else {
		typeName = "观点"
	}
	content, _ = GetReportContentTextSubNew(detail.Content)
	configValue := detailConfig.ConfigValue
	configValue = strings.Replace(configValue, "{{HeadImg}}", detail.HeadImg, -1)
	configValue = strings.Replace(configValue, "{{NickName}}", detail.NickName, -1)
	configValue = strings.Replace(configValue, "{{TypeName}}", typeName, -1)
	configValue = strings.Replace(configValue, "{{PublishTime}}", detail.PublishTime, -1)
	configValue = strings.Replace(configValue, "{{Title}}", detail.Title, -1)
	configValue = strings.Replace(configValue, "{{Content}}", content, -1)

	htm2ImgReq := make(map[string]interface{})
	htm2ImgReq["html_content"] = configValue
	htm2ImgReq["width"] = 2250
	htm2ImgReq["height"] = 3813
	res, err := postHtml2Img(htm2ImgReq)
	if err != nil || res == nil {
		err = errors.New("html转图片失败: " + res.Msg)
		return
	}
	if res.Code != 200 {
		err = errors.New("html转图片失败: " + res.Msg)
		return
	}
	imgUrl = res.Data

	err = models.UpdateYanxuanSpecialMomentsImg(imgUrl, specialId)

	return
}

// 生成研选专栏列表分享到朋友圈的图片
func GetYanxuanSpecialAuthoListMomentsImg() (imgUrl string) {
	var err error
	//time.Sleep(3*time.Second) // 有时候同时添加多个活动，延迟三秒
	defer func() {
		if err != nil {
			fmt.Println("err：", err)
			go utils.SendAlarmMsg("生成研选专栏分享到朋友圈的图片，MakeArticleMomentsImg Err："+err.Error(), 3)
		}
	}()
	var condition string
	var pars []interface{}
	condition += ` AND  a.nick_name <> ''   `
	condition += `	ORDER BY latest_publish_time DESC`
	list, e := models.GetYanxuanSpecialAuthorList(condition, pars, 0, 1)
	if e != nil {
		err = errors.New("GetYanxuanSpecialAuthorList, Err: " + e.Error())
		return
	}

	var SpecialName, HeadImg, NickName, Introduction, PublishTime, Title string
	var userIds []int
	for _, v := range list {
		SpecialName = v.SpecialName
		HeadImg = v.HeadImg
		NickName = v.NickName
		Introduction = v.Introduction
		userIds = append(userIds, v.UserId)
	}
	bestNew := GetBestNewYanxuanSpecialByUserId(userIds)
	for _, v := range list {
		if bestNew[v.UserId] != nil {
			PublishTime = bestNew[v.UserId].PublishTime
			Title = bestNew[v.UserId].Title
		}
	}
	configCode := "special_author_list_moments_img_html"
	detailConfig, e := models.GetConfigByCode(configCode)
	if e != nil {
		err = errors.New("GetCygxConfigDetailByCode 获取生成研选专栏分享到朋友圈的图片格式信息失败, Err: " + e.Error())
		return
	}
	configValue := detailConfig.ConfigValue
	configValue = strings.Replace(configValue, "{{SpecialName}}", SpecialName, -1)
	configValue = strings.Replace(configValue, "{{HeadImg}}", HeadImg, -1)
	configValue = strings.Replace(configValue, "{{NickName}}", NickName, -1)
	configValue = strings.Replace(configValue, "{{Introduction}}", Introduction, -1)
	configValue = strings.Replace(configValue, "{{PublishTime}}", PublishTime, -1)
	configValue = strings.Replace(configValue, "{{Title}}", Title, -1)

	htm2ImgReq := make(map[string]interface{})
	htm2ImgReq["html_content"] = configValue
	htm2ImgReq["width"] = 2250
	htm2ImgReq["height"] = 3813
	res, err := postHtml2Img(htm2ImgReq)
	if err != nil || res == nil {
		err = errors.New("html转图片失败: " + res.Msg)
		return
	}
	if res.Code != 200 {
		err = errors.New("html转图片失败: " + res.Msg)
		return
	}
	imgUrl = res.Data
	configCodeUpdate := "special_author_list_moments_img"
	err = models.UpdateConfigByCode(imgUrl, configCodeUpdate)
	return
}

// 生成研选专栏分享到朋友圈的图片
func GetYanxuanSpecialAuthoMomentsImg(userId int) (err error) {
	//var err error
	//time.Sleep(3*time.Second) // 有时候同时添加多个活动，延迟三秒
	defer func() {
		if err != nil {
			fmt.Println("err：", err)
			go utils.SendAlarmMsg("生成研选专栏分享到朋友圈的图片，GetYanxuanSpecialAuthoMomentsImg Err："+err.Error()+"用户ID"+strconv.Itoa(userId), 3)
		}
	}()

	authorInfo, e := models.GetYanxuanSpecialAuthor(userId, 0, "")
	if e != nil {
		err = errors.New("GetYanxuanSpecialAuthor, Err: " + e.Error())
		return
	}

	configCode := "special_author_moments_img_html"
	detailConfig, e := models.GetConfigByCode(configCode)
	if e != nil {
		err = errors.New("GetCygxConfigDetailByCode 获取生成研选专栏分享到朋友圈的图片格式信息失败, Err: " + e.Error())
		return
	}
	configValue := detailConfig.ConfigValue
	configValue = strings.Replace(configValue, "{{HeadImg}}", authorInfo.HeadImg, -1)
	configValue = strings.Replace(configValue, "{{SpecialName}}", authorInfo.SpecialName, -1)
	configValue = strings.Replace(configValue, "{{NickName}}", authorInfo.NickName, -1)
	configValue = strings.Replace(configValue, "{{SpecialArticleNum}}", strconv.Itoa(authorInfo.SpecialArticleNum), -1)
	configValue = strings.Replace(configValue, "{{CollectNum}}", strconv.Itoa(authorInfo.CollectNum), -1)
	configValue = strings.Replace(configValue, "{{FollowNum}}", strconv.Itoa(authorInfo.FollowNum), -1)
	configValue = strings.Replace(configValue, "{{Introduction}}", authorInfo.Introduction, -1)

	htm2ImgReq := make(map[string]interface{})
	htm2ImgReq["html_content"] = configValue
	htm2ImgReq["width"] = 2250
	htm2ImgReq["height"] = 3813
	res, err := postHtml2Img(htm2ImgReq)
	if err != nil || res == nil {
		err = errors.New("html转图片失败: " + res.Msg)
		return
	}
	if res.Code != 200 {
		err = errors.New("html转图片失败: " + res.Msg)
		return
	}
	imgUrl := res.Data
	e = models.UpdateYanxuanSpecialauthorMomentsImg(imgUrl, userId)
	if e != nil {
		err = errors.New("UpdateYanxuanSpecialauthorMomentsImg Err: " + e.Error())
		return
	}
	DeleteUploadFileToAliyun(authorInfo.MomentsImg) // 删除老的图片
	fmt.Println(imgUrl)
	return

}
