package br

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

func init() {
	// Register all metrics with Prometheus
	prometheus.MustRegister(
		NormalSyncWorkerRunsTotal,
		NormalSyncWorkerDuration,
		NormalSyncSuccessTotal,
		NormalSyncErrorTotal,
		SyncMissingWorkerRunsTotal,
		SyncMissingWorkerDuration,
		SyncMissingSuccessTotal,
		SyncMissingErrorTotal,
		ExpireBackupsWorkerRunsTotal,
		ExpireBackupsWorkerDuration,
		ExpireBackupsSuccessTotal,
		ExpireBackupsErrorTotal,
	)
}

const (
	LabelKey_SharedPoolID = "shared_pool_id"
	LabelKey_ClusterID    = "cluster_id"
	LabelKey_ErrorType    = "error_type"

	LabelValue_NA = "NA"

	NormalSyncErrorType_UpdateSlots           = "update_slots"
	NormalSyncErrorType_RebuildSlots          = "rebuild_slots"
	NormalSyncErrorType_FetchBackups          = "fetch_backups"            // fetch backups from kernel failed
	NormalSyncErrorType_BackupMissing         = "backup_missing"           // keyspace/logical cluster backup not found in kernel backup
	NormalSyncErrorType_SaveBackup            = "save_backup"              // save backup failed
	NormalSyncErrorType_BackupSettingNotFound = "backup_setting_not_found" // backup setting not found
	NormalSyncErrorType_InvalidBackupTime     = "invalid_backup_time"      // invalid backup time
	NormalSyncErrorType_SubmitAuditLog        = "submit_audit_log"         // submit audit log failed

	SyncMissingErrorType_Unclassified  = "unclassified"   // unclassified error
	SyncMissingErrorType_QueryBackups  = "query_backups"  // query backups failed
	SyncMissingErrorType_FetchBackups  = "fetch_backups"  // fetch backups failed
	SyncMissingErrorType_BackupMissing = "backup_missing" // keyspace/logical cluster backup not found in kernel backup
	SyncMissingErrorType_Bug           = "bug"            // bug
	SyncMissingErrorType_SaveBackup    = "save_backup"    // save backup failed

	ExpireBackupsErrorType_QueryBackupSettings = "query_backup_settings" // query backup settings failed
	ExpireBackupsErrorType_DeleteBackups       = "delete_backups"        // delete expired backups failed
	ExpireBackupsErrorType_SetLastCleanAt      = "set_last_clean_at"     // set last clean at failed
	ExpireBackupsErrorType_TransitState        = "transit_state"         // transit state after backup deleted if needed failed
)

var (
	// normal sync worker metrics
	NormalSyncWorkerRunsTotal = prometheus.NewCounter(
		prometheus.CounterOpts{
			Name: "backup_worker_normal_sync_runs_total",
			Help: "Total number of missing backup sync worker runs",
		},
	)
	NormalSyncWorkerDuration = prometheus.NewHistogram(
		prometheus.HistogramOpts{
			Name:    "backup_worker_normal_sync_duration_seconds",
			Help:    "Duration of missing backup sync worker runs",
			Buckets: prometheus.ExponentialBucketsRange(1, 3600, 10), // 1s to 1h
		},
	)
	NormalSyncSuccessTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "backup_normal_sync_success_total",
			Help: "Total number of normal backup sync",
		},
		[]string{LabelKey_SharedPoolID, LabelKey_ClusterID},
	)
	NormalSyncErrorTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "backup_normal_sync_error_total",
			Help: "Total number of normal backup sync failures",
		},
		[]string{LabelKey_SharedPoolID, LabelKey_ClusterID, LabelKey_ErrorType},
	)

	// sync missing worker metrics
	SyncMissingWorkerRunsTotal = prometheus.NewCounter(
		prometheus.CounterOpts{
			Name: "backup_worker_sync_missing_runs_total",
			Help: "Total number of missing backup sync worker runs",
		},
	)
	SyncMissingWorkerDuration = prometheus.NewHistogram(
		prometheus.HistogramOpts{
			Name:    "backup_worker_sync_missing_duration_seconds",
			Help:    "Duration of missing backup sync worker runs",
			Buckets: prometheus.ExponentialBucketsRange(1, 3600, 10), // 1s to 1h
		},
	)
	BackupMissingTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "backup_sync_missing_total",
			Help: "Total number of sync missing backup",
		},
		[]string{LabelKey_SharedPoolID, LabelKey_ClusterID},
	)
	SyncMissingSuccessTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "backup_sync_missing_success_total",
			Help: "Total number of sync missing backup",
		},
		[]string{LabelKey_SharedPoolID, LabelKey_ClusterID},
	)
	SyncMissingErrorTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "backup_sync_missing_error_total",
			Help: "Total number of sync missing backup failures",
		},
		[]string{LabelKey_SharedPoolID, LabelKey_ClusterID, LabelKey_ErrorType},
	)

	// expire backups worker metrics
	ExpireBackupsWorkerRunsTotal = prometheus.NewCounter(
		prometheus.CounterOpts{
			Name: "backup_worker_expire_backups_runs_total",
			Help: "Total number of missing backup sync worker runs",
		},
	)
	ExpireBackupsWorkerDuration = prometheus.NewHistogram(
		prometheus.HistogramOpts{
			Name:    "backup_worker_expire_backups_duration_seconds",
			Help:    "Duration of missing backup sync worker runs",
			Buckets: prometheus.ExponentialBucketsRange(1, 3600, 10), // 1s to 1h
		},
	)
	ExpireBackupsSuccessTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "expire_backups_success_total",
			Help: "Total number of expire backups",
		},
		[]string{LabelKey_SharedPoolID, LabelKey_ClusterID},
	)
	ExpireBackupsErrorTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "expire_backups_error_total",
			Help: "Total number of expire backups failures",
		},
		[]string{LabelKey_SharedPoolID, LabelKey_ClusterID, LabelKey_ErrorType},
	)
)
