package neofscontract

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

// ManageKeysPrm groups parameters of ManageKeys operation.
type ManageKeysPrm struct {
	scriptHash []byte
	ks         [][]byte
	bind       bool

	client.InvokePrmOptional
}

// SetScriptHash sets script hash.
func (m *ManageKeysPrm) SetScriptHash(scriptHash []byte) {
	m.scriptHash = scriptHash
}

// SetKeys sets keys.
func (m *ManageKeysPrm) SetKeys(ks [][]byte) {
	m.ks = ks
}

// SetBind sets operation type: bind/unbind.
func (m *ManageKeysPrm) SetBind(bind bool) {
	m.bind = bind
}

// ManageKeys binds/unbinds list of public keys from NeoFS account by script hash.
func (x *ClientWrapper) ManageKeys(prm ManageKeysPrm) error {
	type args interface {
		SetScriptHash([]byte)
		SetKeys([][]byte)
		SetOptionalPrm(optional client.InvokePrmOptional)
	}

	var (
		a    args
		call func(args) error
	)

	if prm.bind {
		a = new(neofscontract.BindKeysArgs)
		call = func(a args) error {
			return x.client.BindKeys(*a.(*neofscontract.BindKeysArgs))
		}
	} else {
		a = new(neofscontract.UnbindKeysArgs)
		call = func(a args) error {
			return x.client.UnbindKeys(*a.(*neofscontract.UnbindKeysArgs))
		}
	}

	a.SetScriptHash(prm.scriptHash)
	a.SetKeys(prm.ks)
	a.SetOptionalPrm(prm.InvokePrmOptional)

	return call(a)
}