package logger

import (
	"strconv"

	"git.frostfs.info/TrueCloudLab/frostfs-observability/metrics"
	"github.com/prometheus/client_golang/prometheus"
	"go.uber.org/zap/zapcore"
)

const (
	logSubsystem    = "logger"
	logLevelLabel   = "level"
	logDroppedLabel = "dropped"
)

type LogMetrics interface {
	Inc(level zapcore.Level, dropped bool)
	GetSamplingHook() func(e zapcore.Entry, sd zapcore.SamplingDecision)
}

type logMetrics struct {
	logCount *prometheus.CounterVec
}

func NewLogMetrics(namespace string) LogMetrics {
	return &logMetrics{
		logCount: metrics.NewCounterVec(prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: logSubsystem,
			Name:      "entry_count",
			Help:      "Total log entries emitted or dropped by severity level",
		}, []string{logLevelLabel, logDroppedLabel}),
	}
}

func (m *logMetrics) Inc(level zapcore.Level, dropped bool) {
	m.logCount.With(prometheus.Labels{
		logLevelLabel:   level.String(),
		logDroppedLabel: strconv.FormatBool(dropped),
	}).Inc()
}

func (m *logMetrics) GetSamplingHook() func(zapcore.Entry, zapcore.SamplingDecision) {
	return func(e zapcore.Entry, sd zapcore.SamplingDecision) {
		m.Inc(e.Level, sd == zapcore.LogDropped)
	}
}