package metrics

import (
	"github.com/prometheus/client_golang/prometheus"

	"github.com/tidbcloud/infra-api/pkg/metrics/controller"
	"github.com/tidbcloud/infra-api/pkg/metrics/gardener"
	"github.com/tidbcloud/infra-api/pkg/metrics/infra"

	"sigs.k8s.io/controller-runtime/pkg/client"
	k8smetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
)

var (
	ClusterCreationDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: "infra",
			Subsystem: "cluster",
			Name:      "create_stage_duration",
			Help:      "the time that used in each cluster create stage",
			Buckets:   prometheus.ExponentialBuckets(10, 2, 6), // 10s~640s
		}, []string{"stage"})

	InfraClusterPrivateLinkServiceCreationDuration = prometheus.NewGaugeVec(prometheus.GaugeOpts{
		Namespace: "infra",
		Subsystem: "api_resources",
		Name:      "cluster_privatelink_service_creation_duration_seconds",
		Help:      "Seconds time used to create privatelink service in seconds in clusters",
	}, []string{"name", "namespace"})
)

func RegisterMetrics(infraCli client.Client, gardenCli client.Client) {
	k8smetrics.Registry.MustRegister(infra.NewMetricsCollector(infraCli))
	k8smetrics.Registry.MustRegister(gardener.NewMetricsCollector(gardenCli))
	//k8smetrics.Registry.MustRegister(crossplane.NewMetricsCollector(infraCli))
	k8smetrics.Registry.MustRegister(ClusterCreationDuration)
	k8smetrics.Registry.MustRegister(controller.ReconcileDuration)
	k8smetrics.Registry.MustRegister(InfraClusterPrivateLinkServiceCreationDuration)
}
