package qos

import "sync/atomic"

type Metrics interface {
	SetOperationTagCounters(shardID, operation, tag string, pending, inProgress, completed, resourceExhausted uint64)
	Close(shardID string)
}

var _ Metrics = (*noopMetrics)(nil)

type noopMetrics struct{}

func (n *noopMetrics) SetOperationTagCounters(string, string, string, uint64, uint64, uint64, uint64) {
}

func (n *noopMetrics) Close(string) {}

// stat presents limiter statistics cumulative counters.
//
// Each operation changes its status as follows: `pending` -> `in_progress` -> `completed` or `resource_exhausted`.
type stat struct {
	completed         atomic.Uint64
	pending           atomic.Uint64
	resourceExhausted atomic.Uint64
	inProgress        atomic.Uint64
}

type metricsHolder struct {
	metrics Metrics
}