package model

import (
	"active/constant"
	"encoding/json"
	"fmt"

	"git.jiaxianghudong.com/go/utils"
	"git.jiaxianghudong.com/go/xlog"
	"git.jiaxianghudong.com/webs/pkg/rds"
)

//文档: https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/safety-control-capability/riskControl.getUserRiskRank.html
// appid	string		是	小程序appid
// openid	string		是	用户的openid
// scene	number		是	场景值，0:注册，1:营销作弊
// mobile_no	string		否	用户手机号
// client_ip	string		是	用户访问源ip
// email_address	string		否	用户邮箱地址
// extended_info	string		否	额外补充信息
// is_test	boolean		否	false：正式调用，true：测试调用

//RiskRank 个人信息
type RiskRank struct {
	APPID    string `json:"appid"`
	OpenID   string `json:"openid"`
	Scene    int    `json:"scene"`
	ClientIP string `json:"client_ip"`
	IsTest   bool   `json:"is_test"`
}

// ErrCode值	说明
// -1	系统繁忙，此时请开发者稍候再试
// 0	成功
// 48001	小程序无该api权限
// 40001	token 无效
// 40003	openid无效
// 43104	appid与openid不匹配
// 61010	用户访问记录超时（用户未在近两小时访问小程序）

// RiskRank值	说明
// 0	风险等级0
// 1	风险等级1
// 2	风险等级2
// 3	风险等级3
// 4	风险等级4

//RiskRankRsp 返回数据
type RiskRankRsp struct {
	ErrCode   int         `json:"errcode"`
	ErrMsg    string      `json:"errmsg"`
	UnoinID   int         `json:"unoin_id"`
	RiskRank  int         `json:"risk_rank"`
	LabelList []LabelList `json:"label_list"`
}

type LabelList struct {
	Label    string `json:"label"`
	RiskRank int    `json:"risk_rank"`
}

//Getuserriskrank  用户信息数据获取用户的安全等级 risk_rank
func Getuserriskrank(userid, appid, channelid, openid, ip string) (bool, int) {
	akey := fmt.Sprintf("%s_%s", appid, channelid)
	if v, ok := AppsCache[akey]; !ok || v == "" {
		xlog.Infof("异常apps配置:%s  缓存：%+v", akey, AppsCache)
		return true, 3
	}

	rr := RiskRank{
		APPID:    AppsCache[akey],
		OpenID:   openid,
		Scene:    1,
		ClientIP: ip,
		IsTest:   false,
	}
	//.APPID = "wxa27ca98aa5ed1a87"
	params, _ := json.Marshal(rr)
	asstoken := rds.Redis8.Get(AppsCache[akey]).Val()

	//asstoken := "49_tSQtzgrJ3LxxcYPXe2jUrWh8mbxvFlRMrDhC6RPdjHuFPByNiZCi0flby6JItwsIBVLOwQm_nxbYuiJRPHWKDQDAngsbeLCJvpfApnpX_miximLjolob7iQU0c5t3z5Sf7dx2rwhJAiG19i-BZYgAHAWUT"
	ret, err := utils.Post(fmt.Sprintf(constant.WXRiskRankURL, asstoken), params, map[string]string{"Content-Type": "application/json"}, true)
	if err != nil {
		xlog.Infof("Getuserriskrank [%s] Post parm:%s ret:%s err:%v", akey, string(params), string(ret), err)
		return false, 0
	}

	rp := RiskRankRsp{}
	if string(ret) != "" {
		err := json.Unmarshal(ret, &rp)
		if err != nil {
			xlog.Infof("Getuserriskrank [%s] json parm:%s ret:%s err:%v", akey, string(params), string(ret), err)
			return false, 0
		}

		//处理风险等级逻辑
		if rp.ErrCode != 0 {
			if rp.ErrCode == 61010 {
				xlog.Infof("微信风险查询异常 [%s]  userid:%s  parm:%s ret:%s", akey, userid, string(params), string(ret))
				return true, 3
			}

			xlog.Infof("微信风险查询失败 [%s]  userid:%s  parm:%s ret:%s", akey, userid, string(params), string(ret))
			if rp.ErrCode == 48001 {
				rds.Redis.SAdd("unauthorized_apis", akey)
			}
			return false, rp.RiskRank
		}
	}

	if rp.RiskRank == 1 {
		//判断是否只是信誉问题，暂时不拦截
		rp.RiskRank = -1
		for _, v := range rp.LabelList {
			if v.Label == "行为异常" {
				rp.RiskRank = 1
			}
		}
	}

	xlog.Infof("微信风险查询成功%d: [%s] userid:%s  openid:%s  parm:%s ret:%s", rp.RiskRank, akey, userid, openid, string(params), string(ret))

	return true, rp.RiskRank
}
