package utils

import (
	"github.com/tidbcloud/pkgv2/bizerr"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

const (
	MinCustomizedBizErrCode = 40000000
)

var gprcCode2BizCodeMapping = map[codes.Code]bizerr.ErrCode{
	codes.Unknown:           bizerr.ErrCodeUnknown,
	codes.Internal:          bizerr.ErrCodeUnknown,
	codes.OK:                bizerr.ErrCodeOK,
	codes.InvalidArgument:   bizerr.ErrCodeParams,
	codes.DeadlineExceeded:  bizerr.ErrCodeTimeout,
	codes.NotFound:          bizerr.ErrCodeRecordNotFound,
	codes.AlreadyExists:     bizerr.ErrCodeRecordExist,
	codes.PermissionDenied:  bizerr.ErrCodePermission,
	codes.ResourceExhausted: bizerr.ErrCodeTooManyRequests,
	codes.Unauthenticated:   bizerr.ErrCodeAuth,
}

func WrapGrpcError(err error) bizerr.BizError {
	if err == nil {
		return nil
	}

	gs, _ := status.FromError(err)
	code := grpcCode2BizCode(gs.Code())
	return bizerr.New(code, "%s", gs.Message())
}

func grpcCode2BizCode(code codes.Code) bizerr.ErrCode {
	if code >= MinCustomizedBizErrCode {
		return bizerr.ErrCode(code)
	}

	if bizErrCode, ok := gprcCode2BizCodeMapping[code]; ok {
		return bizErrCode
	}
	return bizerr.ErrCodeUnknown
}
