package pprof

import (
	"fmt"
	"net/http"
	"net/http/pprof"
	"runtime"

	"github.com/qdm12/gluetun/internal/httpserver"
)

// New creates a new Pprof server and configure profiling
// with the settings given. It returns an error
// if one of the settings is not valid.
func New(settings Settings) (server *httpserver.Server, err error) {
	runtime.SetBlockProfileRate(*settings.BlockProfileRate)
	runtime.SetMutexProfileFraction(*settings.MutexProfileRate)

	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)
	handler.Handle("/debug/pprof/block", pprof.Handler("block"))
	handler.Handle("/debug/pprof/goroutine", pprof.Handler("goroutine"))
	handler.Handle("/debug/pprof/heap", pprof.Handler("heap"))
	handler.Handle("/debug/pprof/threadcreate", pprof.Handler("threadcreate"))
	settings.HTTPServer.Handler = handler

	settings.SetDefaults()
	if err = settings.Validate(); err != nil {
		return nil, fmt.Errorf("pprof settings failed validation: %w", err)
	}

	return httpserver.New(settings.HTTPServer)
}
