package metrics

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

var (
	// Namespace defines the namespace for the defines metrics.
	Namespace = "opencloud"

	// Subsystem defines the subsystem for the defines metrics.
	Subsystem = "postprocessing"

	buildInfo = promauto.NewGaugeVec(prometheus.GaugeOpts{
		Namespace: Namespace,
		Subsystem: Subsystem,
		Name:      "build_info",
		Help:      "Build information",
	}, []string{"version"})
	eventsOutstandingAcks = promauto.NewGauge(prometheus.GaugeOpts{
		Namespace: Namespace,
		Subsystem: Subsystem,
		Name:      "events_outstanding_acks",
		Help:      "Number of outstanding acks for events",
	})
	eventsUnprocessed = promauto.NewGauge(prometheus.GaugeOpts{
		Namespace: Namespace,
		Subsystem: Subsystem,
		Name:      "events_unprocessed",
		Help:      "Number of unprocessed events",
	})
	eventsRedelivered = promauto.NewGauge(prometheus.GaugeOpts{
		Namespace: Namespace,
		Subsystem: Subsystem,
		Name:      "events_redelivered",
		Help:      "Number of redelivered events",
	})
	finished = promauto.NewCounterVec(prometheus.CounterOpts{
		Namespace: Namespace,
		Subsystem: Subsystem,
		Name:      "finished",
		Help:      "Number of finished postprocessing events",
	}, []string{"status"})
	duration = promauto.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: Namespace,
		Subsystem: Subsystem,
		Name:      "duration_seconds",
		Help:      "Duration of postprocessing operations in seconds",
		Buckets:   []float64{0.1, 0.5, 1, 2.5, 5, 10, 30, 60, 120, 300, 600, 1200},
	}, []string{"status"})
)

// Metrics defines the available metrics of this service.
type Metrics struct {
	// Counter  *prometheus.CounterVec
	BuildInfo             *prometheus.GaugeVec
	EventsOutstandingAcks prometheus.Gauge
	EventsUnprocessed     prometheus.Gauge
	EventsRedelivered     prometheus.Gauge
	Finished              *prometheus.CounterVec
	Duration              *prometheus.HistogramVec
}

// New initializes the available metrics.
func New() *Metrics {
	m := &Metrics{
		BuildInfo:             buildInfo,
		EventsOutstandingAcks: eventsOutstandingAcks,
		EventsUnprocessed:     eventsUnprocessed,
		EventsRedelivered:     eventsRedelivered,
		Finished:              finished,
		Duration:              duration,
	}

	return m
}
