package source

import (
	"github.com/prometheus/client_golang/prometheus"
	"k8s.io/client-go/util/workqueue"
	ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
)

const (
	subsystem = "workqueue"
)

var (
	ackMsgInAddCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Subsystem: subsystem,
		Name:      "ack_msg_in_add_total",
		Help:      "Total number of ack messages in add handled by sqs workqueue",
	}, []string{"name"})

	ackMsgInDoneCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Subsystem: subsystem,
		Name:      "ack_msg_in_done_total",
		Help:      "Total number of ack messages in done handled by sqs workqueue",
	}, []string{"name"})
)

func init() {
	// assume that caller use sigs.k8s.io/controller-runtime/pkg/metrics
	ctrlmetrics.Registry.MustRegister(ackMsgInAddCounter)
	ctrlmetrics.Registry.MustRegister(ackMsgInDoneCounter)
}

type metricsProvider interface {
	ackMsgInAdd()
	ackMsgInDone()
}

type workqueueMetricsProvider struct {
	ackMsgInAddCounter  workqueue.CounterMetric
	ackMsgInDoneCounter workqueue.CounterMetric
}

func (m *workqueueMetricsProvider) ackMsgInAdd() {
	if m == nil {
		return
	}

	m.ackMsgInAddCounter.Inc()
}

func (m *workqueueMetricsProvider) ackMsgInDone() {
	if m == nil {
		return
	}

	m.ackMsgInDoneCounter.Inc()
}

func newMetricsProvider(name string) metricsProvider {
	var del *workqueueMetricsProvider
	if name == "" {
		return del
	}

	return &workqueueMetricsProvider{
		ackMsgInAddCounter:  ackMsgInAddCounter.WithLabelValues(name),
		ackMsgInDoneCounter: ackMsgInDoneCounter.WithLabelValues(name),
	}
}
