package metrics

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

var (
	utilsHttpRequestDur = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Name: "http_requests_duration",
			Help: "How many successful requests for a service",
		},
		[]string{"url", "method"},
	)

	utilsHttpRequestBytes = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Name: "http_response_bytes",
			Help: "How many successful requests for a service",
		},
		[]string{"url", "method"},
	)
)

func init() {
	prometheus.MustRegister(
		serviceOnline,
		serviceFailures,
		serviceSuccess,
		serviceStatusCode,
		serviceLatencyDuration,
		utilsHttpRequestDur,
		utilsHttpRequestBytes,
	)
}

func Histo(method string, value float64, labels ...interface{}) {
	switch method {
	case "latency":
		serviceLatencyDuration.WithLabelValues(convert(labels)...).Observe(value)
	case "duration":
		utilsHttpRequestDur.WithLabelValues(convert(labels)...).Observe(value)
	case "bytes":
		utilsHttpRequestBytes.WithLabelValues(convert(labels)...).Observe(value)
	}
}

func Gauge(method string, value float64, labels ...interface{}) {
	switch method {
	case "service":
		serviceStatusCode.WithLabelValues(convert(labels)...).Set(value)
	case "online":
		serviceOnline.WithLabelValues(convert(labels)...).Set(value)
	}
}

func Inc(method string, labels ...interface{}) {
	switch method {
	case "failure":
		serviceFailures.WithLabelValues(convert(labels)...).Inc()
	case "success":
		serviceSuccess.WithLabelValues(convert(labels)...).Inc()
	}
}

func Add(method string, value float64, labels ...interface{}) {
	switch method {
	case "failure":
		serviceFailures.WithLabelValues(convert(labels)...).Add(value)
	case "success":
		serviceSuccess.WithLabelValues(convert(labels)...).Add(value)
	}
}

func convert(vals []interface{}) []string {
	var out []string
	for _, v := range vals {
		out = append(out, fmt.Sprintf("%v", v))
	}
	return out
}