package data

import (
	"fmt"
	"math/rand"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/shared-provider/pkg/scheme"
	"github.com/tidbcloud/shared-provider/pkg/utils/labels"
	"github.com/tidbcloud/shared-provider/pkg/utils/random"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
	defaultSuffixLen = 5
)

type NetworkPatch func(net *cloudv1.Network) *cloudv1.Network

func (p NetworkPatch) Patch(obj client.Object) client.Object {
	net, ok := obj.(*cloudv1.Network)
	if !ok {
		return obj
	}
	return p(net)
}

func NewDefaultNetwork(provider, ns, region string) *cloudv1.Network {
	// nolint: gomnd // magic number
	projectID := fmt.Sprintf("e2e-%d", rand.Int31n(999999))
	net := &cloudv1.Network{
		ObjectMeta: metav1.ObjectMeta{
			Name:      "test-" + random.Random(defaultSuffixLen),
			Namespace: ns,
			Labels: map[string]string{
				cloudv1.ProviderTypeLabel: provider,
				labels.LabelKeyProject:    projectID,
			},
		},
		Spec: cloudv1.NetworkSpec{
			Provider: provider,
			Region:   region,
			CIDR:     "192.168.1.1/22",
		},
	}
	scheme.Type(net)

	return net
}
