package sender

import (
	"sync"

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

type senderMetrics struct {
	senderCheckPendingTransactionTotal *prometheus.CounterVec
	sendTransactionTotal               *prometheus.CounterVec
	sendTransactionFailureGetFee       *prometheus.CounterVec
	sendTransactionFailureSendTx       *prometheus.CounterVec
	resubmitTransactionTotal           *prometheus.CounterVec
	resubmitTransactionFailedTotal     *prometheus.CounterVec
	currentGasFeeCap                   *prometheus.GaugeVec
	currentGasTipCap                   *prometheus.GaugeVec
	currentGasPrice                    *prometheus.GaugeVec
	currentBlobGasFeeCap               *prometheus.GaugeVec
	currentGasLimit                    *prometheus.GaugeVec
}

var (
	initSenderMetricOnce sync.Once
	sm                   *senderMetrics
)

func initSenderMetrics(reg prometheus.Registerer) *senderMetrics {
	initSenderMetricOnce.Do(func() {
		sm = &senderMetrics{
			sendTransactionTotal: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
				Name: "rollup_sender_send_transaction_total",
				Help: "The total number of sending transactions.",
			}, []string{"service", "name"}),
			sendTransactionFailureGetFee: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
				Name: "rollup_sender_send_transaction_get_fee_failure_total",
				Help: "The total number of sending transactions failure for getting fee.",
			}, []string{"service", "name"}),
			sendTransactionFailureSendTx: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
				Name: "rollup_sender_send_transaction_send_tx_failure_total",
				Help: "The total number of sending transactions failure for sending tx.",
			}, []string{"service", "name"}),
			resubmitTransactionTotal: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
				Name: "rollup_sender_send_transaction_resubmit_send_transaction_total",
				Help: "The total number of resubmit transactions.",
			}, []string{"service", "name"}),
			resubmitTransactionFailedTotal: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
				Name: "rollup_sender_send_transaction_resubmit_send_transaction_failed_total",
				Help: "The total number of failed resubmit transactions.",
			}, []string{"service", "name"}),
			currentGasFeeCap: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{
				Name: "rollup_sender_gas_fee_cap",
				Help: "The gas fee cap of current transaction.",
			}, []string{"service", "name"}),
			currentGasTipCap: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{
				Name: "rollup_sender_gas_tip_cap",
				Help: "The gas tip cap of current transaction.",
			}, []string{"service", "name"}),
			currentGasPrice: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{
				Name: "rollup_sender_gas_price_cap",
				Help: "The gas price of current transaction.",
			}, []string{"service", "name"}),
			currentBlobGasFeeCap: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{
				Name: "rollup_sender_blob_gas_fee_cap",
				Help: "The blob gas fee cap of current transaction.",
			}, []string{"service", "name"}),
			currentGasLimit: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{
				Name: "rollup_sender_gas_limit",
				Help: "The gas limit of current transaction.",
			}, []string{"service", "name"}),
			senderCheckPendingTransactionTotal: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
				Name: "rollup_sender_check_pending_transaction_total",
				Help: "The total number of check pending transaction.",
			}, []string{"service", "name"}),
		}
	})

	return sm
}
