/*
请求结构简介
最近更新时间：2019-08-01 19:14:44

编辑  查看pdf
在这篇文章中：
服务地址
通信协议
请求方法
请求参数
字符编码
对腾讯云的 API 接口的调用是通过向腾讯云 API 的服务端地址发送请求，并按照接口说明在请求中加入相应的请求参数来完成的。腾讯云 API 的请求结构由：服务地址、通信协议、请求方法、请求参数和字符编码组成。具体描述如下：

服务地址
腾讯云 API 的服务接入地址与具体模块相关，详细请参见各接口相关描述。

通信协议
腾讯云 API 的大部分接口都通过 HTTPS 进行通信，为您提供高安全性的通信通道。

请求方法
腾讯云 API 同时支持 POST 和 GET 请求。

注意：

POST 和 GET 请求不能混合使用，若使用 GET 方式，则参数均从 Querystring 取得；
若使用 POST 方式，则参数均从 Request Body 中取得，而 Querystring 中的参数将忽略。
两种请求方式的参数格式规则相同，一般情况下使用 GET 请求，当参数字符串过长时推荐使用 POST。
如果用户的请求方法是 GET，则对所有请求参数值均需要做 URL 编码，若为 POST，则无需对参数编码。
GET 请求的最大长度根据不同的浏览器和服务器设置有所不同，例如，传统 IE 浏览器限制为 2K，Firefox 限制为 8K；对于一些参数较多、长度较长的 API 请求，建议您使用 POST 方法以免在请求过程中会由于字符串超过最大长度而导致请求失败。
对于 POST 请求，您需要使用 x-www-form-urlencoded 的形式传参，因为云 API 侧是从 $_POST 中取出请求参数的。
请求参数
腾讯云 API 的每个请求都需要指定两类参数：公共请求参数以及接口请求参数。其中公共请求参数是每个接口都要用到的请求参数，具体可参见 公共请求参数，而接口请求参数是各个接口所特有的，具体见各个接口的“请求参数”描述。

字符编码
腾讯云 API 的请求及返回结果均使用 UTF-8 字符集进行编码。
*/
package model

import (
	"fmt"
	"time"

	"goutil/mathUtil"
)

// CommonRequest 公共请求参数对象
type CommonRequest struct {
	// Action 指令接口名称(必须)
	Action string

	// 地域参数(必须)
	Region string

	// Timestamp 当前UNIX时间戳(必须)
	Timestamp uint64

	// Nonce 随机正整数(必须)
	Nonce uint32

	// SecretId 在云API密钥上申请的标识身份的SecretId(必须)
	SecretId string

	// 请求签名，用来验证此次请求的合法性，需要用户根据实际的输入参数计算得出。
	Signature string

	// 签名方式，目前支持 HmacSHA256 和 HmacSHA1。只有指定此参数为 HmacSHA256 时，才使用 HmacSHA256 算法验证签名，其他情况均使用 HmacSHA1 验证签名。
	SignatureMethod string

	// 队列名称(此属性虽然不是API文档中的公共属性，但是在队列模型中确实事实上的公共属性，所以将其转移到此处)
	queueName string
}

// AssembleParamMap 组装请求参数字典
// 返回值
// map[string]interface{}:请求参数字
func (this *CommonRequest) AssembleParamMap() map[string]string {
	result := make(map[string]string)

	// 组装参数
	result["Action"] = this.Action
	result["Region"] = this.Region
	result["Timestamp"] = fmt.Sprintf("%d", this.Timestamp)
	result["Nonce"] = fmt.Sprintf("%d", this.Nonce)
	result["SecretId"] = this.SecretId
	result["SignatureMethod"] = this.SignatureMethod
	result["queueName"] = this.queueName

	return result
}

// NewCommonRequest 新建公共请求参数对象
// 参数
// action:指令接口名称
// region:地域
// secretId:在云API密钥上申请的标识身份的SecretId
// queueName:队列名称
// 返回值
// *CommonRequest:公共请求参数对象
func NewCommonRequest(action, region, secretId, queueName string) *CommonRequest {
	return &CommonRequest{
		Action:          action,
		Region:          region,
		Timestamp:       uint64(time.Now().Unix()),
		Nonce:           mathUtil.GetRand().Uint32(),
		SecretId:        secretId,
		SignatureMethod: "HmacSHA256",
		queueName:       queueName,
	}
}
