package hdl

import (
	"applet/app/e"
	"applet/app/lib/aes"
	"applet/app/lib/aes/md"
	"applet/app/svc"
	"applet/app/utils"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"strconv"
	"strings"
	"time"
)

// Demo
// @Summary      Demo测试
// @Tags         Demo
// @Description  Demo样例测试
// @Accept       json
// @Produce      json
// @Param        req 	body      interface{}          true   "任意参数"
// @Success      200   {object}   map[string]interface{}				"返回任意参数"
// @Failure      400   {object}   md.Response              	"具体错误"
// @Router       /api/v1/test [GET]
func Demo(c *gin.Context) {
	var args interface{}
	if c.Request.Method == "GET" {
		args = c.Request.URL.Query()
	} else {
		err := c.ShouldBindJSON(&args)
		if err != nil {
			err = svc.HandleValidateErr(err)
			err1 := err.(e.E)
			e.OutErr(c, err1.Code, err1.Error())
			return
		}
	}

	e.OutSuc(c, map[string]interface{}{
		"args": args,
	}, nil)
	return
}
func Demo1(c *gin.Context) {
	state, _, _, err := svc.GetCertifyQuery(c, "17")
	fmt.Println(state)
	fmt.Println(err)
}

func TestCreateSign(c *gin.Context) {
	var args interface{}
	if c.Request.Method == "GET" {
		args = c.Request.URL.Query()
	} else {
		err := c.ShouldBindJSON(&args)
		if err != nil {
			err = svc.HandleValidateErr(err)
			err1 := err.(e.E)
			e.OutErr(c, err1.Code, err1.Error())
			return
		}
	}

	e.OutSuc(c, map[string]interface{}{
		"args": args,
	}, nil)
	return
}

func CreateSign(c *gin.Context) {
	var query = map[string]string{}
	//1、从请求头中获取必传参数
	query["timestamp"] = c.GetHeader("timestamp")
	query["nonce"] = c.GetHeader("nonce")
	if query["timestamp"] == "" || query["nonce"] == "" {
		e.OutErr(c, e.ERR, "timestamp || nonce 不能为空 ")
		return
	}
	if len(query["nonce"]) != 32 {
		e.OutErr(c, e.ERR, "随机字符串有误 ")
		return
	}
	currentTimestamp := time.Now().Unix()
	storedTimestamp, err := strconv.ParseInt(query["timestamp"], 10, 64)
	if err != nil {
		e.OutErr(c, e.ERR, err.Error())
		return
	}
	if currentTimestamp-storedTimestamp > 300 { // 5分钟
		e.OutErr(c, e.ERR, "时效性过期 ")
		return
	}

	//2、判断请求方式,以获取请求参数
	var aesStr string
	if c.Request.Method == "GET" {
		queryParams := c.Request.URL.Query()
		for key, values := range queryParams {
			if len(values) > 0 {
				query[key] = values[0]
			}
		}
	} else {
		body, _ := ioutil.ReadAll(c.Request.Body)
		if string(body) != "" {
			aesStr = aes.AesEncryptByECB(md.AesKey, string(body))

			var bodyParams = map[string]interface{}{}
			err = json.Unmarshal(body, &bodyParams)
			if err != nil {
				e.OutErr(c, e.ERR, err.Error())
				return
			}
			for key, value := range bodyParams {
				// 使用类型断言判断是否为 string 类型
				if _, ok := value.(map[string]interface{}); ok {
					query[key] = utils.SerializeStr(value)
				} else {
					query[key] = utils.AnyToString(value)
				}
			}
		}
	}

	//3.query参数按照 ASCII 码从小到大排序
	str := utils.JoinStringsInASCII(query, "&", false, false, "")

	//4.md5加密 转小写
	sign := strings.ToLower(utils.Md5(str))

	e.OutSuc(c, map[string]interface{}{
		"aes":      aesStr,
		"sign_str": str,
		"sign":     sign,
	}, nil)
	return
}

func AesDecryptByECB(c *gin.Context) {
	body, _ := ioutil.ReadAll(c.Request.Body)
	strs, err := aes.AesDecryptByECB(md.AesKey, string(body))
	if err != nil {
		e.OutErr(c, e.ERR, err.Error())
		return
	}

	e.OutSuc(c, strs, nil)
	return
}