package fshttp

import (
	"fmt"
	"net/http"

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

// Metrics provide Transport HTTP level metrics.
type Metrics struct {
	StatusCode *prometheus.CounterVec
}

// NewMetrics creates a new metrics instance, the instance shall be assigned to
// DefaultMetrics before any processing takes place.
func NewMetrics(namespace string) *Metrics {
	return &Metrics{
		StatusCode: prometheus.NewCounterVec(prometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: "http",
			Name:      "status_code",
		}, []string{"host", "method", "code"}),
	}
}

// DefaultMetrics specifies metrics used for new Transports.
var DefaultMetrics = (*Metrics)(nil)

// Collectors returns all prometheus metrics as collectors for registration.
func (m *Metrics) Collectors() []prometheus.Collector {
	if m == nil {
		return nil
	}
	return []prometheus.Collector{
		m.StatusCode,
	}
}

func (m *Metrics) onResponse(req *http.Request, resp *http.Response) {
	if m == nil {
		return
	}

	var statusCode = 0
	if resp != nil {
		statusCode = resp.StatusCode
	}

	m.StatusCode.WithLabelValues(req.Host, req.Method, fmt.Sprint(statusCode)).Inc()
}