package morph

import (
	"errors"

	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/netmap"
	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
	"github.com/spf13/viper"
)

func getDefaultNetmapContractConfigMap() map[string]any {
	m := make(map[string]any)
	m[netmap.EpochDurationConfig] = viper.GetInt64(epochDurationInitFlag)
	m[netmap.MaxObjectSizeConfig] = viper.GetInt64(maxObjectSizeInitFlag)
	m[netmap.ContainerFeeConfig] = viper.GetInt64(containerFeeInitFlag)
	m[netmap.ContainerAliasFeeConfig] = viper.GetInt64(containerAliasFeeInitFlag)
	m[netmap.IrCandidateFeeConfig] = viper.GetInt64(candidateFeeInitFlag)
	m[netmap.WithdrawFeeConfig] = viper.GetInt64(withdrawFeeInitFlag)
	m[netmap.HomomorphicHashingDisabledKey] = viper.GetBool(homomorphicHashDisabledInitFlag)
	m[netmap.MaintenanceModeAllowedConfig] = viper.GetBool(maintenanceModeAllowedInitFlag)
	return m
}

func parseConfigFromNetmapContract(arr []stackitem.Item) (map[string][]byte, error) {
	m := make(map[string][]byte, len(arr))
	for _, param := range arr {
		tuple, ok := param.Value().([]stackitem.Item)
		if !ok || len(tuple) != 2 {
			return nil, errors.New("invalid ListConfig response from netmap contract")
		}

		k, err := tuple[0].TryBytes()
		if err != nil {
			return nil, errors.New("invalid config key from netmap contract")
		}

		v, err := tuple[1].TryBytes()
		if err != nil {
			return nil, invalidConfigValueErr(string(k))
		}
		m[string(k)] = v
	}
	return m, nil
}