package metrics

import (
	"sync/atomic"
)

// public api method to proactively retrieve the received TPS value
func GetReceivedTPS() uint64 {
	return atomic.LoadUint64(&measuredReceivedTPS)
}

// counter for the received TPS
var tpsReceivedSinceLastMeasurement uint64

// measured value of the received TPS
var measuredReceivedTPS uint64

// increases the received TPS counter
func increaseReceivedTPSCounter() {
	atomic.AddUint64(&tpsReceivedSinceLastMeasurement, 1)
}

// measures the received TPS value
func measureReceivedTPS() {
	// sample the current counter value into a measured TPS value
	sampledTPS := atomic.LoadUint64(&tpsReceivedSinceLastMeasurement)

	// store the measured value
	atomic.StoreUint64(&measuredReceivedTPS, sampledTPS)

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

	// trigger events for outside listeners
	Events.ReceivedTPSUpdated.Trigger(sampledTPS)
}