package main

import (
	"fmt"
	"runtime"

	"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
	httputil "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/http"
	"go.uber.org/zap"
)

type pprofComponent struct {
	httpComponent
	blockRate int
	mutexRate int
}

const (
	pprofBlockRateKey = "pprof.block_rate"
	pprofMutexRateKey = "pprof.mutex_rate"
)

func newPprofComponent() *pprofComponent {
	return &pprofComponent{
		httpComponent: httpComponent{
			name:    "pprof",
			handler: httputil.Handler(),
		},
	}
}

func (c *pprofComponent) init() {
	c.httpComponent.init()

	if c.enabled {
		c.blockRate = cfg.GetInt(pprofBlockRateKey)
		c.mutexRate = cfg.GetInt(pprofMutexRateKey)
		runtime.SetBlockProfileRate(c.blockRate)
		runtime.SetMutexProfileFraction(c.mutexRate)
	} else {
		c.blockRate = 0
		c.mutexRate = 0
		runtime.SetBlockProfileRate(0)
		runtime.SetMutexProfileFraction(0)
	}
}

func (c *pprofComponent) needReload() bool {
	blockRate := cfg.GetInt(pprofBlockRateKey)
	mutexRate := cfg.GetInt(pprofMutexRateKey)
	return c.httpComponent.needReload() ||
		c.enabled && (c.blockRate != blockRate || c.mutexRate != mutexRate)
}

func (c *pprofComponent) reload() {
	log.Info(fmt.Sprintf("reload %s", c.name))
	if c.needReload() {
		log.Info(fmt.Sprintf("%s config updated", c.name))
		if err := c.shutdown(); err != nil {
			log.Debug(logs.FrostFSIRCouldNotShutdownHTTPServer,
				zap.String("error", err.Error()))
			return
		}

		c.init()
		c.start()
	}
}