package dataplane

import (
	"context"

	dplanemgrv1 "github.com/tidbcloud/cluster-service-ng/api/dataplane-manager/v1"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

// CapabilityLoadBalancerMultiPort is the dataplane-manager capability key
// advertised by dataplanes that support multi-port LoadBalancer specs and
// cloud-agnostic Spec.Annotations passthrough.
const CapabilityLoadBalancerMultiPort = "loadbalancer.multi-port"

// RequireDataplaneCapability returns FailedPrecondition if the dataplane
// does not advertise the requested capability. It is the runtime gate that
// prevents submitting workflows to dataplanes whose DPM version cannot render
// the required resource shape.
func RequireDataplaneCapability(
	ctx context.Context,
	dpClient dplanemgrv1.DataPlaneServiceClient,
	dataplaneId string,
	capability string,
) error {
	dp, err := dpClient.GetDataPlane(ctx, &dplanemgrv1.GetDataPlaneRequest{
		DataPlaneId: dataplaneId,
	})
	if err != nil {
		return err
	}
	for _, c := range dp.GetCapabilities() {
		if c == capability {
			return nil
		}
	}
	return status.Errorf(codes.FailedPrecondition,
		"dataplane %q does not advertise capability %q; upgrade DPM first",
		dataplaneId, capability)
}
