package metrics

import (
	"sync"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/tidbcloud/devops/pkg/infra/errs"
	"github.com/tidbcloud/devops/pkg/infra/metrics"
)

const (
	Namespace   = "devops_server"
	MetricsPath = "/metrics"
)

var (
	registerMetricsOnce sync.Once

	Gin = metrics.Gin(Namespace)
)

func RegisterMetrics() {
	registerMetricsOnce.Do(func() {
		prometheus.MustRegister(
			// Gin
			Gin.ReqDur,
			Gin.RespSize,
			// EventBus
			EventBus.EventHandleDur, EventBus.EventPushTotal,
			// CronJob
			CronJob.SyncCount, CronJob.SyncDur,
			// EventJob
			EventJob.SyncCount, EventJob.SyncDur,
			// K8sUpgrade
			K8sUpgrade.MaintenanceWindowNotCreated, K8sUpgrade.K8sClusterUONotStart,
		)
	})
}

// ResultFromErr returns the result description of a func from an error.
func ResultFromErr(err error) string {
	if _, is := errs.AsRetriableError(err); is {
		return "retriable"
	}
	if err != nil {
		return "failed"
	}
	return "success"
}
