use lazy_static::lazy_static;
use prometheus::{
    HistogramVec, IntCounterVec, IntGaugeVec, register_histogram_vec, register_int_counter_vec,
    register_int_gauge_vec,
};
use tici_common::metrics::{OperationMetrics, OperationMetricsGuard, begin_operation_metrics3};

lazy_static! {
    pub static ref STORAGE_HANDLE_DURATION_HISTOGRAM: HistogramVec = register_histogram_vec!(
        "tici_storage_handle_duration",
        "The duration of backend storage requests",
        &["service", "backend", "type"]
    )
    .unwrap();
    pub static ref STORAGE_HANDLE_COUNTER: IntCounterVec = register_int_counter_vec!(
        "tici_storage_handle_count",
        "The count of backend storage requests",
        &["service", "backend", "type", "result"]
    )
    .unwrap();
    pub static ref STORAGE_HANDLE_INFLIGHT_GAUGE: IntGaugeVec = register_int_gauge_vec!(
        "tici_storage_handle_inflight",
        "The inflight count of backend storage requests",
        &["service", "backend", "type"]
    )
    .unwrap();
}

pub type BackendStorageMetricsGuard = OperationMetricsGuard;

pub fn begin_backend_storage_metrics(
    service: &'static str,
    backend: &'static str,
    operation: &'static str,
) -> BackendStorageMetricsGuard {
    begin_operation_metrics3(
        OperationMetrics::new(
            &STORAGE_HANDLE_DURATION_HISTOGRAM,
            &STORAGE_HANDLE_COUNTER,
            &STORAGE_HANDLE_INFLIGHT_GAUGE,
        ),
        service,
        backend,
        operation,
    )
}
