package main

import (
	"net/http"
	"net/http/pprof"

	"github.com/spf13/viper"
	"go.uber.org/zap"
)

// NewPprofService creates a new service for gathering pprof metrics.
func NewPprofService(v *viper.Viper, l *zap.Logger) *Service {
	handler := http.NewServeMux()
	handler.HandleFunc("/debug/pprof/", pprof.Index)
	handler.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
	handler.HandleFunc("/debug/pprof/profile", pprof.Profile)
	handler.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
	handler.HandleFunc("/debug/pprof/trace", pprof.Trace)

	// Manually add support for paths linked to by index page at /debug/pprof/
	for _, item := range []string{"allocs", "block", "heap", "goroutine", "mutex", "threadcreate"} {
		handler.Handle("/debug/pprof/"+item, pprof.Handler(item))
	}

	return &Service{
		Server: &http.Server{
			Addr:    v.GetString(cfgPProfAddress),
			Handler: handler,
		},
		enabled:     v.GetBool(cfgPProfEnabled),
		serviceType: "Pprof",
		log:         l.With(zap.String("service", "Pprof")),
	}
}