package shadowpool

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

const (
	namespace = "tidb_management_service"
	subsystem = "shadow_pool"
)

var (
	// Fulfill operation metrics
	fulfilSuccessTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "fulfill_success_total",
			Help:      "Total number of successful fulfill operations for shadow pools",
		},
		[]string{"pool_id", "pool_name"},
	)

	fulfilFailureTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "fulfill_failure_total",
			Help:      "Total number of failed fulfill operations for shadow pools",
		},
		[]string{"pool_id", "pool_name"},
	)

	fulfilQuantity = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "fulfill_quantity_total",
			Help:      "Number of clusters created in the last fulfill operation for each shadow pool",
		},
		[]string{"pool_id", "pool_name"},
	)

	// Free operation metrics
	freeSuccessTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "free_success_total",
			Help:      "Total number of successful free operations for shadow pools",
		},
		[]string{"pool_id", "pool_name"},
	)

	freeFailureTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "free_failure_total",
			Help:      "Total number of failed free operations for shadow pools",
		},
		[]string{"pool_id", "pool_name"},
	)

	freeQuantity = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "free_quantity_total",
			Help:      "Number of clusters freed in the last free operation for each shadow pool",
		},
		[]string{"pool_id", "pool_name"},
	)

	// Inventory metrics - cluster status counts
	clusterStatusCount = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "cluster_status",
			Help:      "Number of clusters in each status for each shadow pool",
		},
		[]string{"pool_id", "pool_name", "shadow_state", "is_deleted"},
	)

	// Inventory metrics - metadata cluster count
	metadataClusterCount = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "metadata_cluster",
			Help:      "Number of clusters defined in shadow pool metadata (min/max capacity)",
		},
		[]string{"pool_id", "pool_name", "capacity_type"},
	)

	// Inventory metrics - zero rent record source IP distribution (top IPs by record count)
	zeroRentRecordIPCount = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Namespace: namespace,
			Subsystem: subsystem,
			Name:      "zero_rent_record_ip",
			Help:      "Number of zero_rent_records per source IP (top IPs only)",
		},
		[]string{"source_ip"},
	)
)

// RegisterMetrics registers all shadow pool metrics with Prometheus
func RegisterMetrics() {
	prometheus.MustRegister(fulfilSuccessTotal)
	prometheus.MustRegister(fulfilFailureTotal)
	prometheus.MustRegister(fulfilQuantity)
	prometheus.MustRegister(freeSuccessTotal)
	prometheus.MustRegister(freeFailureTotal)
	prometheus.MustRegister(freeQuantity)
	prometheus.MustRegister(clusterStatusCount)
	prometheus.MustRegister(metadataClusterCount)
	prometheus.MustRegister(zeroRentRecordIPCount)
}
