package monitor

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

// Metrics Prometheus 指标集合
type Metrics struct {
	tvl               prometheus.Gauge
	ethLocked         prometheus.Gauge
	genexMinted       prometheus.Gauge
	discrepancy       prometheus.Gauge
	reconciliations   prometheus.Counter
	largeTransfers    prometheus.Counter
	emergencyPauses   prometheus.Counter
}

func NewMetrics() *Metrics {
	return &Metrics{
		tvl: promauto.NewGauge(prometheus.GaugeOpts{
			Name: "bridge_total_value_locked",
			Help: "Total value locked in the bridge (USD)",
		}),
		ethLocked: promauto.NewGauge(prometheus.GaugeOpts{
			Name: "bridge_eth_locked_amount",
			Help: "Amount locked on Ethereum side",
		}),
		genexMinted: promauto.NewGauge(prometheus.GaugeOpts{
			Name: "bridge_genex_minted_amount",
			Help: "Amount minted on Genex Chain side",
		}),
		discrepancy: promauto.NewGauge(prometheus.GaugeOpts{
			Name: "bridge_discrepancy_amount",
			Help: "Discrepancy between locked and minted amounts",
		}),
		reconciliations: promauto.NewCounter(prometheus.CounterOpts{
			Name: "bridge_reconciliation_total",
			Help: "Total number of reconciliations performed",
		}),
		largeTransfers: promauto.NewCounter(prometheus.CounterOpts{
			Name: "bridge_large_transfer_total",
			Help: "Total number of large bridge transfers detected",
		}),
		emergencyPauses: promauto.NewCounter(prometheus.CounterOpts{
			Name: "bridge_emergency_pause_total",
			Help: "Total number of emergency pauses triggered",
		}),
	}
}

func (m *Metrics) SetTVL(v float64)          { m.tvl.Set(v) }
func (m *Metrics) SetEthLocked(v float64)    { m.ethLocked.Set(v) }
func (m *Metrics) SetGenexMinted(v float64)  { m.genexMinted.Set(v) }
func (m *Metrics) SetDiscrepancy(v float64)  { m.discrepancy.Set(v) }
func (m *Metrics) IncReconciliation()        { m.reconciliations.Inc() }
func (m *Metrics) IncLargeTransfer()         { m.largeTransfers.Inc() }
func (m *Metrics) IncEmergencyPause()        { m.emergencyPauses.Inc() }
