package compapi

import (
	"wechat-api/internal/types"
)

type IntentClient struct {
	MismatchClient
}

func (me *IntentClient) ResponseFormatSetting(req *types.CompApiReq) ResponseFormatConfig {

	//Message重构的配置
	me.ResformatConfig.SysmesArgs = []any{}
	me.ResformatConfig.SysmesTmpl = `# 任务
1. 首先，判断用户的第一句话是否说了：“你好，(任意内容)通话”，如果说了，则不用理会评级规则，直接强制分配为"语音助手"
2. 如果不属于“语音助手”，请根据评级规则，对聊天记录给出评级、置信度、评分依据（逐项分析不要遗漏）

# 细节说明
置信度从0到1，0为置信度最低，1为置信度最高。`

	me.ResformatConfig.UsermesArgs = []any{req.Variables["chat_history"]}
	me.ResformatConfig.UsermesTmpl = `# 评级规则：
        [
        {
            'rule': "用户表现出对产品有积极回应，询问有关产品的问题，或愿意进行后续操作，如确认微信号、询问发货地址或表达接受产品（例：'行'、'好'、'可以'、'是的'）。",
            'score': '有意向'},
        {
            'rule': "用户虽然未积极回应或表示不需要，但却有相关需求、或着符合某项购买条件、又或着询问了机器人问题，即便后期疲软或持否定态度，可移交销售顾问进行进一步的需求分析，以便改善产品或定制符合客户要求的产品",
            'score': '待进一步分析'},
        {
            'rule': "用户表示自己在忙、在开会等，现在不太方便沟通。又或者对电话的真实性存疑，怀疑是诈骗电话，可后续让专业客服继续跟进",
            'score': '暂时无法沟通'},
        {
            'rule': "除上述规则外的其他用户，包括：用户未回复直接挂机、用户拒绝后直接挂机的情况。请注意客户资源珍贵，请尽量归类为'有意向'或'待进一步分析'，后续再由销售专家定性。",
            'score': '其他'}
    ]

        # 聊天记录
        %s
        `

	//ResponseFormat设置的配置
	me.ResformatConfig.ResformatDesc = "为通话记录进行评级"
	me.ResformatConfig.ResformatTxt = `{
    "score": str, #评分结果：有意向、待进一步分析、暂时无法沟通、其他
    "confidence_score": int, #置信度分数，范围从0.0到1.0
    "scoring_criteria": str, #请逐步介绍为何评为这个结果
}`
	me.ResformatConfig.ResformatStruct = struct {
		Score           string  `json:"score" jsonschema_description:"评分结果：有意向、待进一步分析、暂时无法沟通、其他"`
		ConfidenceScore float32 `json:"confidence_score" jsonschema_description:"置信度分数，范围从0.0到1.0"`
		ScoringCriteria string  `json:"scoring_criteria" jsonschema_description:"请逐步介绍为何评为这个结果"`
	}{}
	me.ResformatConfig.HaveSet = true

	return me.ResformatConfig
}

func (me *IntentClient) BuildRequest(req *types.CompApiReq) error {

	//设置相关个性化ResponseFormat配置信息
	if !me.ResformatConfig.HaveSet {
		me.ResponseFormatSetting(req)
	}

	return me.MismatchClient.BuildRequest(req)
}

// 向Client.getClientActFace工厂方法注册
func init() {
	builder := func(c *Client) (clientActionFace, error) {
		return &IntentClient{MismatchClient{StdClient: StdClient{Client: c}}}, nil
	}
	err := RegisterClient("intent", builder)
	if err != nil {
		//panic(fmt.Sprintf("Failed to register client type 'mismatch': %v", err))
	}
}
