package profiler

import (
	"context"
	"expvar"
	"net/http"
	"net/http/pprof"

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

// Profiler is an interface of profiler.
type Profiler interface {
	Start(ctx context.Context)
	Stop()
}

const profilerKey = "pprof"

// NewProfiler is a profiler's constructor.
func NewProfiler(l *zap.Logger, v *viper.Viper) Profiler {
	if !v.GetBool(profilerKey + ".enabled") {
		l.Debug("pprof server disabled")
		return nil
	}

	mux := http.NewServeMux()

	mux.Handle("/debug/vars", expvar.Handler())

	mux.HandleFunc("/debug/pprof/", pprof.Index)
	mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
	mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
	mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
	mux.HandleFunc("/debug/pprof/trace", pprof.Trace)

	return newHTTPServer(httpParams{
		Key:     profilerKey,
		Viper:   v,
		Logger:  l,
		Handler: mux,
	})
}