package metrics

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

type DBProberMetrics struct {
	DescDBPing  *prometheus.Desc
	DescDBWrite *prometheus.Desc
}

func NewDBProberMetrics(clusterID string) *DBProberMetrics {
	m := &DBProberMetrics{}

	constLabels := map[string]string{
		"cluster_id": clusterID,
	}
	m.DescDBPing = prometheus.NewDesc(
		m.fqName("ping"),
		"The result of ping the database.",
		[]string{"db_addr"},
		constLabels,
	)
	m.DescDBWrite = prometheus.NewDesc(
		m.fqName("write"),
		"The result of write to the database.",
		nil,
		constLabels,
	)

	return m
}

func (m *DBProberMetrics) Desc() []*prometheus.Desc {
	return []*prometheus.Desc{
		m.DescDBPing,
		m.DescDBWrite,
	}
}

func (m *DBProberMetrics) DBPing(endpoint string, ok bool) prometheus.Metric {
	return prometheus.MustNewConstMetric(
		m.DescDBPing,
		prometheus.GaugeValue, GaugeBool(ok),
		endpoint,
	)
}

func (m *DBProberMetrics) DBWrite(ok bool) prometheus.Metric {
	return prometheus.MustNewConstMetric(
		m.DescDBWrite,
		prometheus.GaugeValue, GaugeBool(ok),
	)
}

func (m *DBProberMetrics) fqName(name string) string {
	return prometheus.BuildFQName(Namespace, DBProberSubsystem, name)
}
