package services

import (
	"bytes"
	"encoding/json"
	"fmt"
	"hongze/hongze_mobile_admin/models/tables/report"
	"hongze/hongze_mobile_admin/models/tables/wx_user"
	"hongze/hongze_mobile_admin/utils"
	"io/ioutil"
	"net/http"
	"strconv"
	"time"
)

func SendWxTemplateMsg(reportId int) (err error) {
	var msg string
	defer func() {
		if err != nil {
			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
		}
		if msg != "" {
			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
		}
	}()
	utils.FileLog.Info("%s", "services SendMsg")

	report, err := report.GetReportById(reportId)
	if err != nil {
		msg = "GetReportInfo Err:" + err.Error()
		return
	}
	if report == nil {
		utils.FileLog.Info("报告信息不存在")
		return
	}
	accessToken, err := WxGetAccessToken()
	if err != nil {
		msg = "GetWxAccessToken Err:" + err.Error()
		return
	}
	if accessToken == "" {
		msg = "accessToken is empty"
		return
	}
	//获取openid列表
	openIdStr := WxUsersGet()
	openIdList, err := wx_user.GetOpenIdList(openIdStr)
	if err != nil {
		msg = "get openIdList err:" + err.Error()
		return
	}
	fmt.Println("openIdListCount:", len(openIdList))
	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
	fmt.Println("send start")
	utils.FileLog.Info("send start")
	//if report.MsgIsSend == 0 {
	sendMap := make(map[string]interface{})
	sendData := make(map[string]interface{})

	redirectUrl := utils.TemplateRedirectUrl + strconv.Itoa(reportId)
	keyword1 := "弘则日度点评"
	first := "Hi,最新一期日度点评已上线,欢迎查看"
	keyword2 := report.Title
	//keyword3 := report.PublishTime.Format(utils.FormatDateTime)
	keyword3 := report.PublishTime
	keyword4 := report.Abstract

	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}

	sendMap["template_id"] = utils.TemplateIdByProduct
	sendMap["url"] = redirectUrl
	sendMap["data"] = sendData
	sendTemplateMsg(sendUrl, sendMap, openIdList)
	//}
	fmt.Println("send end")
	utils.FileLog.Info("send end")
	return
}

func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*wx_user.OpenIdList) (err error) {
	for _, v := range items {
		sendMap["touser"] = v.OpenId
		data, err := json.Marshal(sendMap)
		if err != nil {
			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
			utils.FileLog.Info("SendTemplateMsgOne Marshal Err:%s", err.Error())
			return err
		}
		err = toSendTemplateMsg(sendUrl, data)
		if err != nil {
			fmt.Println("send err:", err.Error())
			utils.FileLog.Info("ToSendTemplateMsg Err:%s", err.Error())
		}
	}
	return
}

func toSendTemplateMsg(sendUrl string, data []byte) (err error) {
	utils.FileLog.Info("Send:%s", string(data))
	client := http.Client{}
	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
	if err != nil {
		return
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	utils.FileLog.Info("SendResult:%s", string(body))
	var templateResponse SendTemplateResponse
	err = json.Unmarshal(body, &templateResponse)
	if err != nil {
		utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
		return err
	}
	return
}

type SendTemplateResponse struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
	MsgID   int    `json:"msgid"`
}

func SendCompanyApplyWxTemplateMsg(mobile, applyType string) (err error) {
	var msg string
	defer func() {
		if err != nil {
			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
		}
		if msg != "" {
			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
		}
	}()
	utils.FileLog.Info("%s", "services SendMsg")

	accessToken, err := WxGetAccessToken()
	if err != nil {
		msg = "GetWxAccessToken Err:" + err.Error()
		return
	}
	if accessToken == "" {
		msg = "accessToken is empty"
		return
	}
	utils.FileLog.Info("mobile:%s", mobile)

	//获取openid列表
	openIdStr := WxUsersGet()
	openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
	if err != nil {
		msg = "get openIdList err:" + err.Error()
		return
	}
	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
	//fmt.Println("openIdListCount:", len(openIdList))
	if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
		utils.FileLog.Info("start send")
		sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
		fmt.Println("send start")
		utils.FileLog.Info("send start")
		sendMap := make(map[string]interface{})
		sendData := make(map[string]interface{})

		redirectUrl := "" //utils.TemplateRedirectUrl + strconv.Itoa(reportId)
		keyword1 := applyType
		first := "Hi,有新的订单需要审批"
		keyword2 := time.Now().Format(utils.FormatDateTime)
		keyword3 := ""
		remark := ""

		sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
		sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
		sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
		sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
		sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}

		sendMap["template_id"] = utils.TemplateIdByCompanyApply
		sendMap["url"] = redirectUrl
		sendMap["data"] = sendData
		sendTemplateMsg(sendUrl, sendMap, openIdList)
	}
	utils.FileLog.Info("send end")
	return
}