// Package metrics defines JSM Syncer-specific Prometheus metrics.
package metrics

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

const namespace = "jsm_syncer"

var (
	EventsProcessed = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Name:      "events_processed_total",
			Help:      "How many business events JSM Syncer processed.",
		},
		[]string{"source", "kind", "result"},
	)
	EventProcessingDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: namespace,
			Name:      "event_processing_duration_seconds",
			Help:      "How long JSM Syncer takes to process a business event.",
		},
		[]string{"source", "kind", "result"},
	)

	SQSReceiveErrors = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Name:      "sqs_receive_errors_total",
			Help:      "How many SQS receive operations failed.",
		},
		[]string{"queue"},
	)
	SQSDeleteErrors = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Name:      "sqs_delete_errors_total",
			Help:      "How many processed SQS messages could not be deleted.",
		},
		[]string{"queue"},
	)
	SQSInvalidMessages = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Name:      "sqs_invalid_messages_total",
			Help:      "How many SQS messages could not be processed because required fields were missing.",
		},
		[]string{"queue", "reason"},
	)

	ReconciliationRuns = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Name:      "reconciliation_runs_total",
			Help:      "How many reconciliation runs completed.",
		},
		[]string{"job", "trigger", "result"},
	)
	ReconciliationDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: namespace,
			Name:      "reconciliation_duration_seconds",
			Help:      "How long a reconciliation run takes.",
			Buckets:   []float64{1, 5, 10, 30, 60, 300, 900, 1800, 3600, 14400},
		},
		[]string{"job", "trigger", "result"},
	)
	ReconciliationInProgress = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Namespace: namespace,
			Name:      "reconciliation_in_progress",
			Help:      "Whether a reconciliation job is currently running.",
		},
		[]string{"job"},
	)
	ReconciliationQueued = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Name:      "reconciliation_queued_total",
			Help:      "How many reconciliation triggers were queued behind an active run.",
		},
		[]string{"job"},
	)
)

func Register() {
	prometheus.MustRegister(
		EventsProcessed,
		EventProcessingDuration,
		SQSReceiveErrors,
		SQSDeleteErrors,
		SQSInvalidMessages,
		ReconciliationRuns,
		ReconciliationDuration,
		ReconciliationInProgress,
		ReconciliationQueued,
	)
}
