package metrics

import (
	"sync/atomic"
)

// ReceivedMessagesPerSecond retrieves the current messages per second number.
func ReceivedMessagesPerSecond() uint64 {
	return atomic.LoadUint64(&measuredReceivedMPS)
}

// counter for the received MPS
var mpsReceivedSinceLastMeasurement uint64

// measured value of the received MPS
var measuredReceivedMPS uint64

// increases the received MPS counter
func increaseReceivedMPSCounter() {
	atomic.AddUint64(&mpsReceivedSinceLastMeasurement, 1)
}

// measures the received MPS value
func measureReceivedMPS() {
	// sample the current counter value into a measured MPS value
	sampledMPS := atomic.LoadUint64(&mpsReceivedSinceLastMeasurement)

	// store the measured value
	atomic.StoreUint64(&measuredReceivedMPS, sampledMPS)

	// reset the counter
	atomic.StoreUint64(&mpsReceivedSinceLastMeasurement, 0)

	// trigger events for outside listeners
	Events.ReceivedMPSUpdated.Trigger(sampledMPS)
}