package engine

import (
	"time"

	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard/mode"
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/metrics"
)

type MetricRegister interface {
	AddMethodDuration(method string, d time.Duration)

	SetObjectCounter(shardID, objectType string, v uint64)
	AddToObjectCounter(shardID, objectType string, delta int)

	SetMode(shardID string, mode mode.Mode)

	AddToContainerSize(cnrID string, size int64)
	AddToPayloadCounter(shardID string, size int64)
	IncErrorCounter(shardID string)
	ClearErrorCounter(shardID string)
	DeleteShardMetrics(shardID string)

	SetContainerObjectCounter(shardID, contID, objectType string, v uint64)
	IncContainerObjectCounter(shardID, contID, objectType string)
	SubContainerObjectCounter(shardID, contID, objectType string, v uint64)

	WriteCache() metrics.WriteCacheMetrics
	GC() metrics.GCMetrics
}

func elapsed(method string, addFunc func(method string, d time.Duration)) func() {
	t := time.Now()

	return func() {
		addFunc(method, time.Since(t))
	}
}

type gcMetrics struct {
	storage metrics.GCMetrics
	shardID string
}

func (m *gcMetrics) AddRunDuration(d time.Duration, success bool) {
	m.storage.AddRunDuration(m.shardID, d, success)
}

func (m *gcMetrics) AddDeletedCount(deleted, failed uint64) {
	m.storage.AddDeletedCount(m.shardID, deleted, failed)
}

func (m *gcMetrics) AddExpiredObjectCollectionDuration(d time.Duration, success bool, objectType string) {
	m.storage.AddExpiredObjectCollectionDuration(m.shardID, d, success, objectType)
}

func (m *gcMetrics) AddInhumedObjectCount(count uint64, objectType string) {
	m.storage.AddInhumedObjectCount(m.shardID, count, objectType)
}