//go:build develop
// +build develop

package params

import (
	"sync"

	"github.com/mohae/deepcopy"
)

var beaconConfig = MainnetConfig()
var beaconConfigLock sync.RWMutex

// BeaconConfig retrieves beacon chain config.
func BeaconConfig() *BeaconChainConfig {
	beaconConfigLock.RLock()
	defer beaconConfigLock.RUnlock()
	return beaconConfig
}

// OverrideBeaconConfig by replacing the config. The preferred pattern is to
// call BeaconConfig(), change the specific parameters, and then call
// OverrideBeaconConfig(c). Any subsequent calls to params.BeaconConfig() will
// return this new configuration.
func OverrideBeaconConfig(c *BeaconChainConfig) {
	beaconConfigLock.Lock()
	defer beaconConfigLock.Unlock()
	c.InitializeForkSchedule()
	name, ok := reverseConfigNames[c.ConfigName]
	// if name collides with an existing config name, override it, because the fork versions probably conflict
	if !ok {
		// otherwise define it as the special "Dynamic" name, ie for a config loaded from a file at runtime
		name = Dynamic
	}
	KnownConfigs[name] = func() *BeaconChainConfig { return c }
	rebuildKnownForkVersions()
	beaconConfig = c
}

// Copy returns a copy of the config object.
func (b *BeaconChainConfig) Copy() *BeaconChainConfig {
	beaconConfigLock.RLock()
	defer beaconConfigLock.RUnlock()
	config, ok := deepcopy.Copy(*b).(BeaconChainConfig)
	if !ok {
		config = *beaconConfig
	}
	return &config
}
