package security

import (
	"encoding/json"
	"errors"
	"fmt"
	"github.com/silenceper/wechat/v2/miniprogram"
	"github.com/silenceper/wechat/v2/miniprogram/content"
	"github.com/silenceper/wechat/v2/util"
)


// 检查一段文本是否含有违法违规内容。
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html
const SecurityMsgCheckUrl = "https://api.weixin.qq.com/wxa/msg_sec_check"

type Security struct {
	*content.Content
}

type MyMiniprogram struct {
       *miniprogram.MiniProgram
}

func NewMyMiniprogram(miniprogram *miniprogram.MiniProgram) *MyMiniprogram {
	return &MyMiniprogram{miniprogram}
}

type BodyContent struct {
	Version       int8    `json:"version"`    // 接口版本号，2.0版本为固定值2
	Openid        string  `json:"openid"`     // 用户的openid（用户需在近两小时访问过小程序）
	Scene         int8    `json:"scene"`      // 场景枚举值（1 资料；2 评论；3 论坛；4 社交日志）
	Content       string  `json:"content"`    // 需检测的文本内容，文本字数的上限为2500字，需使用UTF-8编码
	Nickname      string  `json:"nickname"`   // 用户昵称，需使用UTF-8编码
	Title         string  `json:"title"`      // 文本标题，需使用UTF-8编码
	Signature     string  `json:"signature"`  // 个性签名，该参数仅在资料类场景有效(scene=1)，需使用UTF-8编码
}

func (s *MyMiniprogram) MsgSecCheckWithResult(bodyContent *BodyContent) (result Result, err error)  {
	var accessToken string
	accessToken, err = s.GetContentSecurity().GetAccessToken()
	if err != nil {
		return
	}
	uri := fmt.Sprintf("%s?access_token=%s", SecurityMsgCheckUrl, accessToken)
	response, err := util.PostJSON(uri, bodyContent)
	if err != nil {
		return
	}
	return DecodeWithResult(response, "MsgSecCheck")
}

type Result struct {
	Result *ResultBody
}
type ResultBody struct {
	Suggest string  //建议，有risky、pass、review三种值
	Label  int      //命中标签枚举值，100 正常；10001 广告；20001 时政；20002 色情；20003 辱骂；20006 违法犯罪；20008 欺诈；20012 低俗；20013 版权；21000 其他
}

func DecodeWithResult(response []byte, apiName string) (result Result, err error)  {
	var commError util.CommonError
	err = json.Unmarshal(response, &commError)
	if err != nil {
		return
	}
	if commError.ErrCode != 0 {
		err = errors.New(fmt.Sprintf("%s Error , errcode=%d , errmsg=%s", apiName, commError.ErrCode, commError.ErrMsg))
		return
	}
	err = json.Unmarshal(response, &result)
	if err != nil {
		return
	}
	return
}

