package services

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

//访谈申请
func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (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)
			go utils.SendAlarmMsg(fmt.Sprint("访谈申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
		}
		if msg != "" {
			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
		}
	}()

	accessToken, err := models.GetWxAccessTokenByXzs()
	if err != nil {
		msg = "GetWxAccessToken Err:" + err.Error()
		return
	}
	if accessToken == "" {
		msg = "accessToken is empty"
		return
	}

	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken

	sendMap := make(map[string]interface{})
	sendData := make(map[string]interface{})

	keyword1 := realName + "【" + companyName + "】"
	first := "您有一条新的访谈申请,请及时处理。"
	keyword2 := mobile
	keyword3 := time.Now().Format(utils.FormatDateTime)
	keyword4 := articleTitle
	fontColor := "#D9001B"
	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}

	sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
	sendMap["data"] = sendData
	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
	fmt.Println("send end")
	return
}

//访谈申请取消
func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (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)
			go utils.SendAlarmMsg(fmt.Sprint("访谈申请取消模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
		}
		if msg != "" {
			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
		}
	}()
	accessToken, err := models.GetWxAccessTokenByXzs()
	if err != nil {
		msg = "GetWxAccessToken Err:" + err.Error()
		return
	}
	if accessToken == "" {
		msg = "accessToken is empty"
		return
	}

	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken

	sendMap := make(map[string]interface{})
	sendData := make(map[string]interface{})

	first := realName + "-" + mobile + "【" + companyName + "】的访谈申请已取消,请留意。"
	keyword1 := articleTitle
	keyword2 := time.Now().Format(utils.FormatDateTime)
	fontColor := "#D9001B"
	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}

	sendMap["template_id"] = utils.WxMsgTemplateIdApplyCancelXzs
	sendMap["data"] = sendData
	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
	fmt.Println("send end")
	return
}

//权限申请
func SendPermissionApplyTemplateMsg(realName, companyName, mobile, applyMethod string, itemOpenid *models.OpenIdList) (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)
			go utils.SendAlarmMsg(fmt.Sprint("权限申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
		}
		if msg != "" {
			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
		}
	}()

	var accessToken string
	if utils.RunMode == "release" {
		accessToken, err = models.GetWxAccessTokenByXzs()
		if err != nil {
			msg = "GetWxAccessToken Err:" + err.Error()
			return
		}
		if accessToken == "" {
			msg = "accessToken is empty"
			return
		}
	} else {
		accessToken, err = models.GetWxAccessToken()
		if err != nil {
			msg = "GetWxAccessToken Err:" + err.Error()
			return
		}
		if accessToken == "" {
			msg = "accessToken is empty"
			return
		}
	}

	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken

	sendMap := make(map[string]interface{})
	sendData := make(map[string]interface{})

	keyword1 := realName + "【" + companyName + "】"
	first := "查研观向有一条新的权限申请,请及时处理。"
	keyword2 := mobile
	keyword3 := time.Now().Format(utils.FormatDateTime)
	keyword4 := applyMethod
	fontColor := "#D9001B"
	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
	if utils.RunMode == "release" {
		sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
	} else {
		sendMap["template_id"] = utils.WxMsgTemplateIdApply
	}
	sendMap["data"] = sendData
	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
	fmt.Println("send end")
	return
}

func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, itemOpenid *models.OpenIdList, resource string, sendType int) (err error) {
	sendMap["touser"] = itemOpenid.OpenId
	data, err := json.Marshal(sendMap)
	if err != nil {
		fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
		return err
	}
	err = toSendTemplateMsg(sendUrl, data, resource, sendType, itemOpenid)
	if err != nil {
		fmt.Println("send err:", err.Error())
	}
	return
}

func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
	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)
	var templateResponse SendTemplateResponse
	err = json.Unmarshal(body, &templateResponse)
	fmt.Println(templateResponse)
	utils.FileLog.Info("SendResult %s:", string(body))
	if err != nil {
		utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
		return err
	}
	//新增模板消息推送记录
	{
		tr := new(models.UserTemplateRecord)
		tr.UserId = dataItem.UserId
		tr.OpenId = dataItem.OpenId
		tr.Resource = resource
		tr.SendData = string(data)
		tr.Result = string(body)
		tr.CreateDate = time.Now().Format(utils.FormatDate)
		tr.CreateTime = time.Now().Format(utils.FormatDateTime)
		if templateResponse.Errcode == 0 {
			tr.SendStatus = 1
		} else {
			tr.SendStatus = 0
		}
		tr.SendType = sendType
		go func() {
			err = models.AddUserTemplateRecord(tr)
			if err != nil {
				utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
			}
		}()
	}
	return
}

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

type SendWxTemplate struct {
	WxAppId        string   `description:"公众号appId"`
	First          string   `description:"模板消息first字段"`
	Keyword1       string   `description:"模板消息keyword1字段"`
	Keyword2       string   `description:"模板消息keyword2字段"`
	Keyword3       string   `description:"模板消息keyword3字段"`
	Keyword4       string   `description:"模板消息keyword4字段"`
	Remark         string   `description:"模板消息remark字段"`
	TemplateId     string   `description:"模板id"`
	RedirectUrl    string   `description:"跳转地址"`
	RedirectTarget int      `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序"`
	Resource       string   `description:"资源唯一标识"`
	SendType       int      `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
	OpenIdArr      []string `description:"消息接收者openid"`
}

//推送模板消息
func PublicSendTemplateMsg(sendInfo *SendWxTemplate) (err error) {
	postData, err := json.Marshal(sendInfo)
	if err != nil {
		utils.SendAlarmMsg("SendTemplateMsg json.Marshal Err:"+err.Error(), 1)
		return err
	}
	body := ioutil.NopCloser(strings.NewReader(string(postData)))
	client := &http.Client{}
	req, err := http.NewRequest("POST", utils.SendWxTemplateMsgUrl, body)
	if err != nil {
		utils.SendAlarmMsg("SendTemplateMsg http.NewRequest Err:"+err.Error(), 1)
		return err
	}
	contentType := "application/json;charset=utf-8"
	req.Header.Set("Content-Type", contentType)
	req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("http client.Do Err:" + err.Error())
		return err
	}
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}
	result := new(models.BaseResponse)
	err = json.Unmarshal(b, &result)
	if err != nil {
		return err
	}
	if result.Ret != 200 {
		err = errors.New(string(b))
		return err
	}
	return
}