package node

import (
	metrics "github.com/nspcc-dev/neofs-node/pkg/network/transport/metrics/grpc"
	metrics2 "github.com/nspcc-dev/neofs-node/pkg/services/metrics"
	"github.com/spf13/viper"
	"go.uber.org/atomic"
	"go.uber.org/dig"
	"go.uber.org/zap"
)

type (
	metricsParams struct {
		dig.In

		Logger  *zap.Logger
		Options []string `name:"node_options"`
		Viper   *viper.Viper
		Buckets Buckets
	}

	metricsServiceParams struct {
		dig.In

		Logger    *zap.Logger
		Collector metrics2.Collector
	}
)

func newObjectCounter() *atomic.Float64 { return atomic.NewFloat64(0) }

func newMetricsService(p metricsServiceParams) (metrics.Service, error) {
	return metrics.New(metrics.Params{
		Logger:    p.Logger,
		Collector: p.Collector,
	})
}

func newMetricsCollector(p metricsParams) (metrics2.Collector, error) {
	return metrics2.New(metrics2.Params{
		Options:      p.Options,
		Logger:       p.Logger,
		Interval:     p.Viper.GetDuration("metrics_collector.interval"),
		MetricsStore: p.Buckets[fsBucket],
	})
}