package utils

import "github.com/VictoriaMetrics/metrics"

type namedMetric struct {
	Name string
}

// Unregister removes the metric by name from default registry
func (nm namedMetric) Unregister() {
	metrics.UnregisterMetric(nm.Name)
}

// Gauge is a metrics.Gauge with Name
type Gauge struct {
	namedMetric
	*metrics.Gauge
}

// GetOrCreateGauge creates a new Gauge with the given name
func GetOrCreateGauge(name string, f func() float64) *Gauge {
	return &Gauge{
		namedMetric: namedMetric{Name: name},
		Gauge:       metrics.GetOrCreateGauge(name, f),
	}
}

// Counter is a metrics.Counter with Name
type Counter struct {
	namedMetric
	*metrics.Counter
}

// GetOrCreateCounter creates a new Counter with the given name
func GetOrCreateCounter(name string) *Counter {
	return &Counter{
		namedMetric: namedMetric{Name: name},
		Counter:     metrics.GetOrCreateCounter(name),
	}
}

// Summary is a metrics.Summary with Name
type Summary struct {
	namedMetric
	*metrics.Summary
}

// GetOrCreateSummary creates a new Summary with the given name
func GetOrCreateSummary(name string) *Summary {
	return &Summary{
		namedMetric: namedMetric{Name: name},
		Summary:     metrics.GetOrCreateSummary(name),
	}
}