package neofscontract

import (
	"fmt"

	"github.com/nspcc-dev/neofs-node/pkg/morph/client"
)

// BindKeysArgs groups the arguments
// of key binding call.
type BindKeysArgs struct {
	commonBindArgs
}

// UnbindKeysArgs groups the arguments
// of key unbinding call.
type UnbindKeysArgs struct {
	commonBindArgs
}

type commonBindArgs struct {
	scriptHash []byte // script hash of account identifier

	keys [][]byte // list of serialized public keys

	client.InvokePrmOptional
}

// SetOptionalPrm sets optional client parameters.
func (x *commonBindArgs) SetOptionalPrm(op client.InvokePrmOptional) {
	x.InvokePrmOptional = op
}

// SetScriptHash sets script hash of the NeoFS account identifier.
func (x *commonBindArgs) SetScriptHash(v []byte) {
	x.scriptHash = v
}

// SetKeys sets list of public keys in a binary format.
func (x *commonBindArgs) SetKeys(v [][]byte) {
	x.keys = v
}

// BindKeys invokes the call of key binding method
// of NeoFS contract.
func (x *Client) BindKeys(args BindKeysArgs) error {
	prm := client.InvokePrm{}

	prm.SetMethod(x.bindKeysMethod)
	prm.SetArgs(args.scriptHash, args.keys)
	prm.InvokePrmOptional = args.InvokePrmOptional

	err := x.client.Invoke(prm)
	if err != nil {
		return fmt.Errorf("could not invoke method (%s): %w", x.bindKeysMethod, err)
	}

	return nil
}

// UnbindKeys invokes the call of key unbinding method
// of NeoFS contract.
func (x *Client) UnbindKeys(args UnbindKeysArgs) error {
	prm := client.InvokePrm{}

	prm.SetMethod(x.unbindKeysMethod)
	prm.SetArgs(args.scriptHash, args.keys)
	prm.InvokePrmOptional = args.InvokePrmOptional

	err := x.client.Invoke(prm)
	if err != nil {
		return fmt.Errorf("could not invoke method (%s): %w", x.unbindKeysMethod, err)
	}

	return nil
}