package neofsid

import (
	"crypto/elliptic"
	"fmt"

	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
	"github.com/nspcc-dev/neofs-api-go/pkg/owner"
	"github.com/nspcc-dev/neofs-node/pkg/morph/client/neofsid"
)

// AccountKeys requests public keys of NeoFS account from NeoFS ID contract.
func (x *ClientWrapper) AccountKeys(id *owner.ID) (keys.PublicKeys, error) {
	var args neofsid.KeyListingArgs

	args.SetOwnerID(id.ToV2().GetValue())

	res, err := (*neofsid.Client)(x).AccountKeys(args)
	if err != nil {
		return nil, err
	}

	binKeys := res.Keys()
	ks := make(keys.PublicKeys, 0, len(binKeys))

	curve := elliptic.P256()

	for i := range binKeys {
		k, err := keys.NewPublicKeyFromBytes(binKeys[i], curve)
		if err != nil {
			return nil, fmt.Errorf("received invalid key: %w", err)
		}

		ks = append(ks, k)
	}

	return ks, nil
}