package server

import (
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/collectors"
)

const subsystem = "auditlog"

// Label constants.
const (
	LableType   = "result"
	LableResult = "result"
)

// Label value constants.
const (
	LabelResultSuccess = "success"
	LabelResultFail    = "fail"
)

var (
	pushLogDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Subsystem: subsystem,
			Name:      "push_file_duration_seconds",
			Help:      "Bucketed histogram of push file to storage.",
			Buckets:   prometheus.ExponentialBuckets(0.001, 2, 25),
		}, []string{LableResult})

	errorCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Subsystem: subsystem,
			Name:      "error_event_total",
			Help:      "Counter of error events",
		}, []string{LableType})

	// Maybe caused by some issue we failed to push file to storage.
	// If the permission to not granted in right way, we should just blame
	// the user and let he know.
	deleteLogFileDueToDiskFullCounter = prometheus.NewCounter(
		prometheus.CounterOpts{
			Subsystem: subsystem,
			Name:      "delete_log_file_due_to_disk_full_total",
			Help:      "Counter of files deleted due to disk full",
		})

	storageSizeCapacityBytes = prometheus.NewGauge(
		prometheus.GaugeOpts{
			Subsystem: subsystem,
			Name:      "storage_size_capacity_bytes",
			Help:      "bytes of capacity storage size",
		})

	storageSizeAvailableBytes = prometheus.NewGauge(
		prometheus.GaugeOpts{
			Subsystem: subsystem,
			Name:      "storage_size_available_bytes",
			Help:      "bytes of available storage size",
		})
)

func register(registry *prometheus.Registry) {
	registry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))
	registry.MustRegister(collectors.NewGoCollector())

	registry.MustRegister(pushLogDuration)
	registry.MustRegister(errorCounter)
	registry.MustRegister(deleteLogFileDueToDiskFullCounter)
	registry.MustRegister(storageSizeCapacityBytes)
	registry.MustRegister(storageSizeAvailableBytes)
}
