package main

import (
	"github.com/asymmetric-research/solana-exporter/pkg/slog"
	"github.com/prometheus/client_golang/prometheus"
)

type GaugeDesc struct {
	Desc           *prometheus.Desc
	Name           string
	Help           string
	VariableLabels []string
}

func NewGaugeDesc(name string, description string, variableLabels ...string) *GaugeDesc {
	return &GaugeDesc{
		Desc:           prometheus.NewDesc(name, description, variableLabels, nil),
		Name:           name,
		Help:           description,
		VariableLabels: variableLabels,
	}
}

func (c *GaugeDesc) MustNewConstMetric(value float64, labels ...string) prometheus.Metric {
	logger := slog.Get()
	if len(labels) != len(c.VariableLabels) {
		logger.Fatalf("Provided labels (%v) do not match %s labels (%v)", labels, c.Name, c.VariableLabels)
	}
	logger.Debugf("Emitting %v to %s(%v)", value, labels, c.Name)
	return prometheus.MustNewConstMetric(c.Desc, prometheus.GaugeValue, value, labels...)
}

func (c *GaugeDesc) NewInvalidMetric(err error) prometheus.Metric {
	return prometheus.NewInvalidMetric(c.Desc, err)
}
