// This file is auto-generated, don't edit it. Thanks.
package ali

import (
	"fmt"
	"time"

	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	dyvmsapi20170525 "github.com/alibabacloud-go/dyvmsapi-20170525/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
)

type client struct {
	dyvmCli     *dyvmsapi20170525.Client
	rateLimiter RateLimiter
}

func (cli *client) SingleCall(param SingleCallParam) (_err error) {
	useSecondary := false
	if !cli.rateLimiter.CheckRecord(param.CalledNumber, time.Now()) {
		useSecondary = true
		_err = fmt.Errorf("rate limited, number: %s", param.CalledNumber)
	}

	useNumber := primaryNumber
	if useSecondary {
		useNumber = secondaryNumber
	}

	singleCallByTtsRequest := &dyvmsapi20170525.SingleCallByTtsRequest{
		CalledShowNumber: tea.String(useNumber),
		CalledNumber:     tea.String(param.CalledNumber),
		TtsCode:          tea.String(TtsCode),
	}
	runtime := &util.RuntimeOptions{}
	tryErr := func() (_e error) {
		defer func() {
			if r := tea.Recover(recover()); r != nil {
				_e = r
			}
		}()
		_, _err = cli.dyvmCli.SingleCallByTtsWithOptions(singleCallByTtsRequest, runtime)
		if _err != nil {
			return _err
		}

		return nil
	}()

	if tryErr != nil {
		var error = &tea.SDKError{}
		if _t, ok := tryErr.(*tea.SDKError); ok {
			error = _t
		} else {
			error.Message = tea.String(tryErr.Error())
		}
		_, _err = util.AssertAsString(error.Message)
		if _err != nil {
			return _err
		}
	} else if !useSecondary {
		_err = cli.rateLimiter.InsertRecord(param.CalledNumber, time.Now())
		if _err != nil {
			return _err
		}
	}

	return _err
}

// Description:
//
// 使用AK&SK初始化账号Client
//
// @return Client
//
// @throws Exception
func NewClient(aliconfig AliCliConfig) (_result AliCli, _err error) {
	// 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考。
	// 建议使用更安全的 STS 方式，更多鉴权访问方式请参见：https://help.aliyun.com/document_detail/378661.html。
	config := &openapi.Config{
		// 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
		AccessKeyId: tea.String(aliconfig.AccessKeyId),
		// 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
		AccessKeySecret: tea.String(aliconfig.AccessKeySecret),
	}
	// Endpoint 请参考 https://api.aliyun.com/product/Dyvmsapi
	config.Endpoint = tea.String("dyvmsapi.aliyuncs.com")
	dyvmsCli := &dyvmsapi20170525.Client{}
	dyvmsCli, _err = dyvmsapi20170525.NewClient(config)

	rLimiter := NewRateLimiter()

	return &client{dyvmCli: dyvmsCli, rateLimiter: rLimiter}, _err
}

func NewDefaultClient() (_result AliCli, _err error) {
	return NewClient(AliCliConfig{
		AccessKeyId:     accessKeyId,
		AccessKeySecret: accessKeySecret,
	})
}
