package api

import (
	"context"
	"strconv"

	"message-service/internal/bean/dto"
	service "message-service/internal/service/central"

	"github.com/tidbcloud/message-service/idl/pbgen/proto/api"
	"github.com/tidbcloud/tiinf/errs"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.buf.build/protocolbuffers/go/linuxgit/tidbcloud/base"
	"go.uber.org/zap"
)

const maxQuestionLength = 1024 * 5

type chatBotService struct {
	api.UnsafeChatBotServiceServer
}

func NewChatBotService() api.ChatBotServiceServer {
	return &chatBotService{}
}

func (c *chatBotService) ChatBot(ctx context.Context, req *api.ChatBotReq) (*api.ChatBotRsp, error) {
	tilog.Info(ctx, "api chat bot req", zap.Any("req", req))

	if req.ProjectId == 0 || req.ClusterId == 0 || req.Question == "" || req.Database == "" || req.Caller == "" {
		tilog.Info(ctx, "param invalid", zap.Any("req", req))
		return nil, errs.NewBadRequest("param invalid", nil)
	}
	if len(req.Question) > maxQuestionLength {
		return nil, errs.NewBadRequest("question is too large", nil)
	}

	caller := req.Caller
	param := &dto.InteractRequest{
		BotType:               req.BotType,
		SessionID:             req.SessionId,
		Question:              req.Question,
		Database:              req.Database,
		ProjectID:             req.ProjectId,
		ClusterID:             strconv.FormatUint(req.ClusterId, 10),
		PromptTemplate:        req.PromptTemplate,
		PromptTemplateVersion: req.PromptTemplateVersion,
	}

	result, err := service.InteractBot(ctx, param, caller)
	if err != nil {
		tilog.Info(ctx, "api chat bot err", zap.Any("'req", req), zap.Any("'err", err))
		return nil, err
	}

	rsp := &api.ChatBotRsp{
		BaseResp: &base.BaseResp{
			ErrCode: 0,
			ErrMsg:  "ok",
		},
		SessionId:  result.SessionID,
		Prompt:     result.Prompt,
		Completion: result.Response,
		Code:       int32(result.Code),
	}

	tilog.Info(ctx, "api chat bot rsp", zap.Any("'req", req), zap.Any("'rsp", rsp))

	return rsp, nil

}
