package main

import (
	"strconv"

	sdk "github.com/nspcc-dev/neofs-api-go/pkg/netmap"
	"github.com/nspcc-dev/neofs-api-go/v2/netmap"
	"github.com/nspcc-dev/neofs-node/pkg/util/attributes"
	"github.com/spf13/viper"
)

const (
	// list of default values for well-known attributes
	defaultCapacity = 0
	defaultPrice    = 0
)

func parseAttributes(v *viper.Viper) []*netmap.Attribute {
	stringAttributes := readAttributes(v)

	attrs, err := attributes.ParseV2Attributes(stringAttributes, nil)
	if err != nil {
		fatalOnErr(err)
	}

	return addWellKnownAttributes(attrs)
}

func readAttributes(v *viper.Viper) (attrs []string) {
	const maxAttributes = 100

	for i := 0; i < maxAttributes; i++ {
		attr := v.GetString(cfgNodeAttributePrefix + "_" + strconv.Itoa(i))
		if attr == "" {
			return
		} else {
			attrs = append(attrs, attr)
		}
	}

	return attrs
}

func addWellKnownAttributes(attrs []*netmap.Attribute) []*netmap.Attribute {
	var hasCapacity, hasPrice bool

	// check if user defined capacity and price attributes
	for i := range attrs {
		if !hasPrice && attrs[i].GetKey() == sdk.PriceAttr {
			hasPrice = true
		} else if !hasCapacity && attrs[i].GetKey() == sdk.CapacityAttr {
			hasCapacity = true
		}
	}

	// do not override user defined capacity and price attributes

	if !hasCapacity {
		capacity := new(netmap.Attribute)
		capacity.SetKey(sdk.CapacityAttr)
		capacity.SetValue(strconv.FormatUint(defaultCapacity, 10))
		attrs = append(attrs, capacity)
	}

	if !hasPrice {
		price := new(netmap.Attribute)
		price.SetKey(sdk.PriceAttr)
		price.SetValue(strconv.FormatUint(defaultPrice, 10))
		attrs = append(attrs, price)
	}

	return attrs
}