package models

import (
	"time"
	"wechat-conf/models/model"
	"wechat-conf/utils"

	"github.com/astaxie/beego"
)

// ComponentInit 初始化第三方
func ComponentInit() {
	var conf = model.SysComponentConf{}

	_, err := DBEngine.Get(&conf)
	if err != nil {
		utils.LogError("初始化第三方失败:", err)
		return
	}
	utils.LogError("获取第三方信息:", conf)
	if conf.Appid == "" {
		utils.LogError("初始化第三方数据失败,数据为空")
		return
	}
	d := "0"
	if !conf.ExpiresDate.IsZero() {
		now := time.Now()
		subd := conf.ExpiresDate.Sub(now)
		beego.Error(d)
		d = string(subd)
	}

	var cert = map[string]string{
		"appid":                 conf.Appid,
		"aeskey":                conf.Aeskey,
		"secret":                conf.Secret,
		"componentVerifyTicket": conf.Ticket,
		"token":                 conf.Token,
		"expires_in":            d,
	}

	utils.ComponentInit(cert, UpdateComponentToken)
}

// UpdateComponentToken 更新第三方token
func UpdateComponentToken(token map[string]interface{}) {
	beego.Error("更新第三方token:", token)
	if token["accessToken"].(string) == "" {
		return
	}

	var conf = model.SysComponentConf{
		Token: token["accessToken"].(string),
	}

	expire := token["expire_in"].(int64)
	if expire > 0 {
		expriesTime := time.Now().Local().Add(time.Duration(expire) * time.Second)
		conf.ExpiresDate = expriesTime
		sql := `update sys_component_conf set token=?,expires_date=?`
		_, err := DBEngine.Exec(sql, conf.Token, conf.ExpiresDate)
		if err != nil {
			utils.LogError("更新第三方token失败:", err)
		}
	} else {
		sql := `update sys_component_conf set token=?`
		_, err := DBEngine.Exec(sql, conf.Token, conf.ExpiresDate)
		if err != nil {
			utils.LogError("更新第三方token失败:", err)
		}
	}
}

// InitWechat 初始化微信
func InitWechat() {
	var wxconfs []model.SysWechatConf
	err := DBEngine.Where("status>?", STATUS_DEL).Find(&wxconfs)
	if err != nil {
		utils.LogError("初始化微信失败:", err)
		return
	}

	for _, conf := range wxconfs {
		var cert = map[string]string{
			"authorizer_access_token":  conf.Token,
			"authorizer_refresh_token": conf.RefreshToken,
			"authorization_code":       conf.AuthorizationCode,
			"appid":                    conf.Appid,
		}
		client := utils.WechatInit(cert, UpdateToken)
		beego.Error(client)
		utils.AppendWxClient(client)
	}
}

// UpdateToken 更新微信token
func UpdateToken(token map[string]interface{}) {
	var conf = model.SysWechatConf{
		Token:        token["token"].(string),
		RefreshToken: token["refreshToken"].(string),
		Appid:        token["appid"].(string),
	}
	expire := token["expire_in"].(int64)
	if expire > 0 {
		beego.Error(time.Now())
		expriesTime := time.Now().Local().Add(time.Duration(expire) * time.Second)
		beego.Error(expriesTime)
		conf.ExpiresDate = expriesTime
		sql := `update sys_wechat_conf set token=?,refresh_token=?,expires_date=? where appid=?`
		_, err := DBEngine.Exec(sql, conf.Token, conf.RefreshToken, expriesTime, conf.Appid)
		if err != nil {
			utils.LogError("更新微信token失败:", err)
		}
	} else {
		sql := `update sys_wechat_conf set token=?,refresh_token=? where appid=?`
		_, err := DBEngine.Exec(sql, conf.Token, conf.RefreshToken, conf.Appid)
		if err != nil {
			utils.LogError("更新微信token失败:", err)
		}
	}
}