package metrics

import (
	"github.com/prometheus/client_golang/prometheus"
	"sigs.k8s.io/controller-runtime/pkg/metrics"
)

const (
	dispatcherComponent = "dispatcher"
)

var (
	NetworkPhase = NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "network_status_phase",
			Help:      "Phase of network status",
		},
		[]string{"provider_type", "namespace", "network", "region", "kubernetes", "phase"},
		[]string{"namespace", "network"},
	)

	ClusterPhase = NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "cluster_status_phase",
			Help:      "Phase of tidb cluster status",
		},
		[]string{"provider_type", "namespace", "tidb", "kubernetes", "network", "phase"},
		[]string{"namespace", "tidb"},
	)

	BackupPhase = NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "backup_status_phase",
			Help:      "Phase of backup status",
		},
		[]string{"provider_type", "namespace", "backup", "kubernetes", "tidb", "phase"},
		[]string{"namespace", "backup"},
	)

	RestorePhase = NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "restore_status_phase",
			Help:      "Phase of restore status",
		},
		[]string{"provider_type", "namespace", "restore", "kubernetes", "tidb", "phase"},
		[]string{"namespace", "restore"},
	)

	ImportPhase = NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "import_status_phase",
			Help:      "Phase of import status",
		},
		[]string{"provider_type", "namespace", "import", "kubernetes", "tidb", "phase"},
		[]string{"namespace", "import"},
	)

	NetworkCreationTime = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "network_creation_time",
			Help:      "Timestamp when network is created",
		},
		[]string{"provider_type", "namespace", "network"},
	)

	ClusterCreationTime = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "cluster_creation_time",
			Help:      "Timestamp when cluster is created",
		},
		[]string{"provider_type", "namespace", "tidb"},
	)

	BackupCreationTime = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "backup_creation_time",
			Help:      "Timestamp when backup is created",
		},
		[]string{"provider_type", "namespace", "backup"},
	)

	RestoreCreationTime = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "restore_creation_time",
			Help:      "Timestamp when restore is created",
		},
		[]string{"provider_type", "namespace", "restore"},
	)

	ImportCreationTime = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "import_creation_time",
			Help:      "Timestamp when import is created",
		},
		[]string{"provider_type", "namespace", "import"},
	)

	NetworkRescheduleFailedReason = NewGaugeVec(
		prometheus.GaugeOpts{
			Subsystem: dispatcherComponent,
			Name:      "network_reschedule_failed_reason",
			Help:      "failed reason of network reschedule",
		},
		[]string{"provider_type", "namespace", "network", "reason"},
		[]string{"namespace", "network"},
	)
)

func init() {
	// Register custom metrics with the global prometheus registry
	metrics.Registry.MustRegister(NetworkPhase)
	metrics.Registry.MustRegister(ClusterPhase)
	metrics.Registry.MustRegister(BackupPhase)
	metrics.Registry.MustRegister(RestorePhase)
	metrics.Registry.MustRegister(ImportPhase)

	metrics.Registry.MustRegister(NetworkCreationTime)
	metrics.Registry.MustRegister(ClusterCreationTime)
	metrics.Registry.MustRegister(BackupCreationTime)
	metrics.Registry.MustRegister(RestoreCreationTime)
	metrics.Registry.MustRegister(ImportCreationTime)

	metrics.Registry.MustRegister(NetworkRescheduleFailedReason)
}
