package metrics

import (
	"git.frostfs.info/TrueCloudLab/frostfs-observability/metrics"
	"github.com/prometheus/client_golang/prometheus"
)

type shardIDModeValue struct {
	modeValue *prometheus.GaugeVec
}

func newShardIDMode(subsystem, name, help string) *shardIDModeValue {
	return &shardIDModeValue{
		modeValue: metrics.NewGaugeVec(
			prometheus.GaugeOpts{
				Namespace: namespace,
				Subsystem: subsystem,
				Name:      name,
				Help:      help,
			}, []string{shardIDLabel, modeLabel}),
	}
}

func (m *shardIDModeValue) SetMode(shardID string, mode string) {
	m.modeValue.DeletePartialMatch(prometheus.Labels{
		shardIDLabel: shardID,
	})

	m.modeValue.With(prometheus.Labels{
		shardIDLabel: shardID,
		modeLabel:    mode,
	}).Set(1)
}

func (m *shardIDModeValue) Delete(shardID string) {
	m.modeValue.DeletePartialMatch(prometheus.Labels{
		shardIDLabel: shardID,
	})
}

type shardIDPathModeValue struct {
	modeValue *prometheus.GaugeVec
}

func newShardIDPathMode(subsystem, name, help string) *shardIDPathModeValue {
	return &shardIDPathModeValue{
		modeValue: metrics.NewGaugeVec(
			prometheus.GaugeOpts{
				Namespace: namespace,
				Subsystem: subsystem,
				Name:      name,
				Help:      help,
			}, []string{shardIDLabel, pathLabel, modeLabel}),
	}
}

func (m *shardIDPathModeValue) SetMode(shardID, path string, mode string) {
	m.modeValue.DeletePartialMatch(prometheus.Labels{
		shardIDLabel: shardID,
		pathLabel:    path,
	})

	m.modeValue.With(prometheus.Labels{
		shardIDLabel: shardID,
		pathLabel:    path,
		modeLabel:    mode,
	}).Set(1)
}

func (m *shardIDPathModeValue) Delete(shardID, path string) {
	m.modeValue.DeletePartialMatch(prometheus.Labels{
		shardIDLabel: shardID,
		pathLabel:    path,
	})
}

func modeFromBool(readOnly bool) string {
	modeValue := readWriteMode
	if readOnly {
		modeValue = readOnlyMode
	}
	return modeValue
}