package metricslogger

import (
	"net"
	"net/http"

	"github.com/yusing/go-proxy/internal/metrics"
)

type MetricsLogger struct {
	ServiceName string `json:"service_name"`
}

func NewMetricsLogger(serviceName string) *MetricsLogger {
	return &MetricsLogger{serviceName}
}

func (m *MetricsLogger) GetHandler(next http.Handler) http.HandlerFunc {
	return func(rw http.ResponseWriter, req *http.Request) {
		m.ServeHTTP(rw, req, next.ServeHTTP)
	}
}

func (m *MetricsLogger) ServeHTTP(rw http.ResponseWriter, req *http.Request, next http.HandlerFunc) {
	visitorIP, _, err := net.SplitHostPort(req.RemoteAddr)
	if err != nil {
		visitorIP = req.RemoteAddr
	}

	// req.RemoteAddr had been modified by middleware (if any)
	lbls := &metrics.HTTPRouteMetricLabels{
		Service: m.ServiceName,
		Method:  req.Method,
		Host:    req.Host,
		Visitor: visitorIP,
		Path:    req.URL.Path,
	}

	next.ServeHTTP(newHTTPMetricLogger(rw, lbls), req)
}

func (m *MetricsLogger) ResetMetrics() {
	metrics.GetRouteMetrics().UnregisterService(m.ServiceName)
}