package cron

import (
	"sync"

	"github.com/prometheus/client_golang/prometheus"
)

var (
	templateUnavailableUsageGauge = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Name: "cluster_ng_template_unavailable_usage",
			Help: "Count of components using unavailable template versions.",
		},
		[]string{"template_name", "status", "component_type"},
	)
	templateUnknownUsageGauge = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Name: "cluster_ng_template_unknown_usage",
			Help: "Count of components with unknown template versions.",
		},
		[]string{"template_name", "component_type"},
	)

	templateUsageMetricsMu sync.Mutex
	lastUnavailableLabels  = map[string]templateUnavailableLabel{}
	lastUnknownLabels      = map[string]templateUnknownLabel{}
)

var registerMetricsOnce sync.Once

func ensureMetricsRegistered() {
	registerMetricsOnce.Do(func() {
		prometheus.MustRegister(templateUnavailableUsageGauge)
		prometheus.MustRegister(templateUnknownUsageGauge)
	})
}

type templateUnavailableLabel struct {
	templateName  string
	status        string
	componentType string
}

func (l templateUnavailableLabel) key() string {
	return l.templateName + "\x1f" + l.status + "\x1f" + l.componentType
}

type templateUnknownLabel struct {
	templateName  string
	componentType string
}

func (l templateUnknownLabel) key() string {
	return l.templateName + "\x1f" + l.componentType
}
