package services

import (
	"fmt"

	asr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/asr/v20190614"
	"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"
)

type TencentRecTaskReq struct {
	SecretId    string
	SecretKey   string
	FileUrl     string
	CallbackUrl string
}

// TencentCreateRecTask 创建录音文件识别
func TencentCreateRecTask(req TencentRecTaskReq) (taskId int, err error) {
	if req.SecretId == "" || req.SecretKey == "" || req.FileUrl == "" {
		err = fmt.Errorf("参数有误, SecretId: %s, SecretKey: %s, FileUrl: %s", req.SecretId, req.SecretKey, req.FileUrl)
		return
	}
	credential := common.NewCredential(
		req.SecretId,
		req.SecretKey,
	)
	cpf := profile.NewClientProfile()
	cpf.HttpProfile.Endpoint = "asr.tencentcloudapi.com"
	client, e := asr.NewClient(credential, "", cpf)
	if e != nil {
		err = fmt.Errorf("asr NewClient err: %s", e.Error())
		return
	}

	// 实例化一个请求对象, 具体参数看文档https://cloud.tencent.com/document/product/1093/37823
	request := asr.NewCreateRecTaskRequest()
	request.EngineModelType = common.StringPtr("16k_zh")
	request.ChannelNum = common.Uint64Ptr(1)
	request.ResTextFormat = common.Uint64Ptr(2)
	request.SourceType = common.Uint64Ptr(0)
	request.Url = common.StringPtr(req.FileUrl)
	if req.CallbackUrl != "" {
		request.CallbackUrl = common.StringPtr(req.CallbackUrl)
	}
	request.SpeakerDiarization = common.Int64Ptr(1)
	request.SpeakerNumber = common.Int64Ptr(0)
	request.ConvertNumMode = common.Int64Ptr(0)
	request.FilterDirty = common.Int64Ptr(2)
	request.FilterPunc = common.Int64Ptr(0)
	request.FilterModal = common.Int64Ptr(2)

	// 返回的resp是一个CreateRecTaskResponse的实例
	response, e := client.CreateRecTask(request)
	if _, ok := e.(*errors.TencentCloudSDKError); ok {
		err = fmt.Errorf("asr CreateRecTask err: %s", e.Error())
		return
	}
	// 唯一标识, 回调会用到
	taskId = int(*response.Response.Data.TaskId)
	//fmt.Printf("%s", response.ToJsonString())
	return
}

// TencentRecTaskCallback 录音识别回调参数
type TencentRecTaskCallback struct {
	Code         int     `description:"任务状态码,0为成功,其他:失败;详见https://cloud.tencent.com/document/product/1093/52632"`
	Message      string  `description:"失败原因文字描述,成功时此值为空"`
	RequestId    uint64  `json:"requestId" description:"任务唯一标识,与录音识别请求中返回的TaskId一致。数据格式必须设置为Uint64"`
	Appid        uint64  `description:"腾讯云应用ID"`
	ProjectId    int     `json:"projectid" description:"腾讯云项目ID"`
	AudioUrl     string  `json:"audioUrl" description:"语音URL,如创建任务时为上传数据的方式,则不包含该字段"`
	Text         string  `description:"识别出的结果文本"`
	ResultDetail string  `json:"resultDetail" description:"包含详细识别结果,如创建任务时 ResTextFormat 为0,则不包含该字段"`
	AudioTime    float64 `json:"audioTime" description:"语音总时长"`
}

// TencentRecTaskCallbackResp 录音识别回调响应体
type TencentRecTaskCallbackResp struct {
	Code    int    `description:"0为成功, 其他值代表失败"`
	Message string `description:"失败原因说明"`
}

// TencentRecTaskSentenceDetail 录音识别相应结果-单句详情
type TencentRecTaskSentenceDetail struct {
	FinalSentence string `description:"单句最终结果"`
	StartMs       int    `description:"单句开始时间(毫秒)"`
	EndMs         int    `description:"单句结束时间(毫秒)"`
}