package data

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

const (
	// in dev
	// defaultTenant = "30060"
	// in staging
	defaultTenant = "1369847559691397265"
)

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(project, cloud, region string) *cloudv1.Network {
	var provider string
	switch cloud {
	// TODO: use common const package
	case "gcp":
		provider = "gke"
	case "aws":
		provider = "eks"
	}
	net := &cloudv1.Network{
		ObjectMeta: metav1.ObjectMeta{
			Name:      provider + "-" + region,
			Namespace: project,
			Labels: map[string]string{
				cloudv1.ProviderTypeLabel:  provider,
				cloudv1.TenantTagKey:       defaultTenant,
				cloudv1.ProjectTagKey:      project,
				"cloud.pingcap.com/manage": "full",
			},
		},
		Spec: cloudv1.NetworkSpec{
			Provider: provider,
			Region:   region,
			CIDR:     "10.1.0.0/16",
		},
	}

	return net
}

func NetworkWithCIDR(cidr string) NetworkPatch {
	return func(n *cloudv1.Network) *cloudv1.Network {
		n.Spec.CIDR = cidr
		return n
	}
}

func ResetNetworkStatus() NetworkPatch {
	return func(n *cloudv1.Network) *cloudv1.Network {
		n.Status = cloudv1.NetworkStatus{}

		return n
	}
}
