package aliyun

import (
	"encoding/json"
	"errors"
	"fmt"
	avatar20220130 "github.com/alibabacloud-go/avatar-20220130/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"strings"
	"wechat-api/internal/utils/jwt"
)

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

	// Endpoint 请参考 https://api.aliyun.com/product/avatar
	config.Endpoint = tea.String("avatar.cn-zhangjiakou.aliyuncs.com")
	_result = &avatar20220130.Client{}
	_result, _err = avatar20220130.NewClient(config)
	return _result, _err
}

// StartInstance 启动数字人 userId=1234 bizId=xxoo
func StartInstance(userId, bizId string) (*avatar20220130.StartInstanceResponseBodyData, error) {
	accessKeyId := GetAccessKeyId()
	accessKeySecret := GetAccessKeySecret()
	tenantId := GetTenantId()
	appId := GetAppId()

	client, _err := CreateClient(accessKeyId, accessKeySecret)
	if _err != nil {
		return nil, _err
	}

	startInstanceRequest := &avatar20220130.StartInstanceRequest{
		TenantId: tea.Int64(tenantId),
		App: &avatar20220130.StartInstanceRequestApp{
			AppId: tea.String(appId),
		},
		User: &avatar20220130.StartInstanceRequestUser{
			UserId: tea.String(userId),
		},
		BizId: tea.String(bizId),
	}

	_result, _err := client.StartInstance(startInstanceRequest)
	if _err != nil {
		return nil, _err
	}
	if *_result.Body.Success {
		fmt.Println(_result.Body.Data)
		return _result.Body.Data, nil
	}
	return nil, errors.New(*_result.Body.Message)
}

func _main(args []*string) (_err error) {
	client, _err := CreateClient("", "")
	if _err != nil {
		return _err
	}

	sendMessageRequest := &avatar20220130.SendMessageRequest{
		SessionId: tea.String("your_value"),
		TenantId:  tea.Int64(1),
		Feedback:  tea.Bool(false),
	}
	tryErr := func() (_e error) {
		defer func() {
			if r := tea.Recover(recover()); r != nil {
				_e = r
			}
		}()
		// 复制代码运行请自行打印 API 的返回值
		_, _err = client.SendMessageWithOptions(sendMessageRequest, &util.RuntimeOptions{})
		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())
		}
		// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
		// 错误 message
		fmt.Println(tea.StringValue(error.Message))
		// 诊断地址
		var data interface{}
		d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
		d.Decode(&data)
		if m, ok := data.(map[string]interface{}); ok {
			recommend, _ := m["Recommend"]
			fmt.Println(recommend)
		}
		_, _err = util.AssertAsString(error.Message)
		if _err != nil {
			return _err
		}
	}
	return _err
}

// GetBizID 业务请求id,最大支持 64 位字符
// (注意 可以使用该字段做业务启动数字人的幂等,服务端确保同一个 bizId 多次调用只会开启一路实例)
// 鉴于以上原因这里确保每个用户只启动一个实例
func GetBizID(userId uint64) string {
	return jwt.HashidsEncode(int(userId))
}

// GetAccessKeyId 获取AccessKeyId
func GetAccessKeyId() string {
	return "LTAI5tET2mMQVTcMDftuM8Cp"
}

// GetAccessKeySecret 获取AccessKeySecret
func GetAccessKeySecret() string {
	return "AmGsD8VzwEuj8njZpUCUYnK7uUBTJa"
}

// GetAppId 获取AppId
func GetAppId() string {
	return "3dt553bl52"
}

// GetTenantId 租户ID
func GetTenantId() int64 {
	return int64(27174)
}

//func main() {
//	err := _main(tea.StringSlice(os.Args[1:]))
//	if err != nil {
//		panic(err)
//	}
//}