package cmek

import (
	"context"
	"strconv"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	openapingv1beta2 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/nextgen/v1beta2"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/app/openapi/nextgen/common"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/grpc/metadata"
)

func (s serverImpl) GetCustomerManagedEncryptionKey(ctx context.Context,
	request *openapingv1beta2.GetCustomerManagedEncryptionKeyRequest,
) (*openapingv1beta2.CustomerManagedEncryptionKey, error) {
	ctx, span := tracer.Start(ctx, "GetCustomerManagedEncryptionKey")
	defer span.End()

	_, err := metadata.ExtractRequestMetaWithCheckPermission(ctx)
	if err != nil {
		return nil, bizerr.WrapErrorWithCode(err, bizerr.ErrCodeParams, "failed to extract request metadata")
	}

	cmekId, err := strconv.ParseUint(request.CustomerManagedEncryptionKeyId, 10, 64)
	if err != nil {
		return nil, bizerr.WrapErrorWithCode(err, bizerr.ErrCodeParams, "invalid cmek id")
	}

	cmekGlobal, err := s.nextgenCli.GetCustomerManagedEncryptionKey(ctx, &globalngv1.GetCustomerManagedEncryptionKeyRequest{
		CustomerManagedEncryptionKeyId: cmekId,
	})
	if err != nil {
		return nil, err
	}

	return common.CvtGlobalCmekToOpenapi(cmekGlobal)
}
