/*获取对应sdk
go get -u github.com/tencentcloud/tencentcloud-sdk-go
*/
package voicemsgMgr

import (
	"fmt"

	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
	vms "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vms/v20200902" // 引入 vms
	"goutil/logUtil"
)

const (
	//请求方法
	REG_METHOD = "POST"
	//域名
	END_POINT = "vms.tencentcloudapi.com"
	//签名方式
	SIGN_METHOD = "TC3-HMAC-SHA256"
)

//语音电话结构体
type VoiceMessage struct {
	//语音发送客户端
	client *vms.Client

	//配置
	voiceMessageConfig *VoiceMessageConfig
}

//拨打语音电话
//telephone:电话号码（格式：+[国家或地区码][用户号码]）
//playTimes:播放次数，可选，最多3次，默认2次
//para:参数，根据配置的模板传入参数格式，按顺序传入
func (this *VoiceMessage) SendVoice(telephone string, playTimes uint64, param ...string) (err error) {
	//初始化请求参数
	request := vms.NewSendTtsVoiceRequest()

	// 模板 ID，必须填写在控制台审核通过的模板 ID，可登录 [语音消息控制台] 查看模板 ID
	request.TemplateId = common.StringPtr(this.voiceMessageConfig.TemplateId)

	//模板构造参数，模板参数，若模板没有参数，则为空数组
	paramLit := []string{}
	if len(param) > 0 {
		for _, val := range param {
			paramLit = append(paramLit, val)
		}
	}
	request.TemplateParamSet = common.StringPtrs(paramLit)

	/* 被叫手机号码，采用 e.164 标准，格式为+[国家或地区码][用户号码]
	* 例如：+8613711112222，其中前面有一个+号，86为国家码，13711112222为手机号*/
	request.CalledNumber = common.StringPtr(telephone)

	//在语音控制台添加应用后生成的实际SdkAppid，示例如1400006666
	request.VoiceSdkAppid = common.StringPtr(this.voiceMessageConfig.VoiceSdkAppid)

	//播放次数，可选，最多3次，默认2次
	request.PlayTimes = common.Uint64Ptr(playTimes)

	//用户的 session 内容，腾讯 server 回包中会原样返回
	request.SessionContext = common.StringPtr("test")

	//通过 client 对象调用想要访问的接口，需要传入请求对象
	_, err = this.client.SendTtsVoice(request)
	// 处理异常
	if _, ok := err.(*errors.TencentCloudSDKError); ok {
		logUtil.ErrorLog(fmt.Sprintf("SDK异常，语音电话拨打失败,错误信息为:%s", err))
		return
	}
	//非SDK异常，直接失败。实际代码中可以加入其他的处理
	if err != nil {
		logUtil.ErrorLog(fmt.Sprintf("非SDK异常，语音电话拨打失败,错误信息为:%s", err))
		return
	}

	return
}

//创建新的对象
//secretId:API密钥Id
//secretKey:API密钥key
//region:地域
//templateId:模板ID
//appid:应用后生成的实际SdkAppid
func NewVoiceMessage(secretId, secretKey, region, templateId, appid string) *VoiceMessage {
	//构造配置模型
	voiceMessageConfigObj := &VoiceMessageConfig{
		SecretId:      secretId,
		SecretKey:     secretKey,
		Region:        region,
		TemplateId:    templateId,
		VoiceSdkAppid: appid,
	}

	//通过配置实例化
	return NewVoiceMessageBuConfig(voiceMessageConfigObj)
}

//通过配置实例化
func NewVoiceMessageBuConfig(voiceMessageConfigObj *VoiceMessageConfig) *VoiceMessage {
	//实例化一个认证对象，入参需要传入腾讯云账户密钥对 secretId 和 secretKey
	credential := common.NewCredential(
		voiceMessageConfigObj.SecretId,
		voiceMessageConfigObj.SecretKey,
	)

	/* 非必要步骤:
	* 实例化一个客户端配置对象，可以指定超时时间等配置 */
	cpf := profile.NewClientProfile()
	/* SDK 默认使用 POST 方法
	* 如需使用 GET 方法，可以在此处设置，但 GET 方法无法处理较大的请求 */
	cpf.HttpProfile.ReqMethod = REG_METHOD
	/* SDK 有默认的超时时间，非必要请不要进行调整
	* 如有需要请在代码中查阅以获取最新的默认值 */
	//cpf.HttpProfile.ReqTimeout = 5
	/* SDK 会自动指定域名，通常无需指定域名，但访问金融区的服务时必须手动指定域名
	* 例如 VMS 的上海金融区域名为 vms.ap-shanghai-fsi.tencentcloudapi.com */
	cpf.HttpProfile.Endpoint = END_POINT
	/* SDK 默认用 TC3-HMAC-SHA256 进行签名，非必要请不要修改该字段 */
	cpf.SignMethod = SIGN_METHOD

	//初始化客户端
	vmsclient, err := vms.NewClient(credential, voiceMessageConfigObj.Region, cpf)
	if err != nil {
		logUtil.ErrorLog(fmt.Sprintf("初始化VMS的client 对象失败,错误信息为:%s", err))
		return nil
	}

	//构造对象
	voiceMessageObj := &VoiceMessage{
		client:             vmsclient,
		voiceMessageConfig: voiceMessageConfigObj,
	}

	//返回对象
	return voiceMessageObj
}
