// Package grpc add by blacknc <blacknc@163.com> at 2023/11/17 16:07:39
package grpc

import (
	"context"
	"dataservices/commons/metrics"
	"dataservices/commons/utils"
	"fmt"
	"strconv"
	"strings"

	"github.com/tidbcloud/pkgv2/bizerr"
	tierr "github.com/tidbcloud/tiinf/errs"
	"go.buf.build/protocolbuffers/go/linuxgit/tidbcloud/base"
)

func recordRpcCounterMetric(svc string, err error) {
	code := "0"
	if err != nil {
		if tiErr, ok := tierr.AsTiError(err); ok {
			code = strconv.FormatInt(tiErr.BizCode(), 10)
		} else if bizErr, ok := err.(bizerr.BizError); ok {
			code = strconv.FormatInt(int64(bizErr.ErrCode()), 10)
		} else {
			code = "-1"
		}
	}
	metrics.DownstreamRpcCounter.WithLabelValues(svc, getRpcFunc(6, false), code).Inc()
}

func getRpcFunc(skip int, isConvert bool) string {
	funcName := utils.GetFuncNameWithSkip(skip)
	nameList := strings.Split(funcName, "grpc.")
	if len(nameList) > 1 {
		funcName = nameList[1]
	}
	if isConvert {
		funcName = utils.CamelToSnake(funcName)
	}
	return funcName
}

func getCurrentFunc(isConvert bool) string {
	return getRpcFunc(4, isConvert)
}

func getParentFunc(isConvert bool) string {
	return getRpcFunc(5, isConvert)
}

var approvedErrCode = map[int64]bool{
	tierr.ErrCodeBadRequest: true,
	tierr.ErrCodeNotFound:   true,
}

func parseRpcError(ctx context.Context, baseResp *base.BaseResp) error {

	err, ok := tierr.AsTiError(tierr.ParseBaseResp(ctx, baseResp))
	if !ok {
		return nil
	}
	if approvedErrCode[err.BizCode()] {
		return err
	}
	return tierr.NewError(err, fmt.Sprintf("%s failed[%d]", getParentFunc(true), err.BizCode()), err)
}
