package netmap

import (
	netmapclient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/netmap"
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
	"github.com/nspcc-dev/neo-go/pkg/core/transaction"
	"github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
	"github.com/nspcc-dev/neo-go/pkg/util"
)

func NewNetmapClient(netmapClient *netmapclient.Client) Client {
	return &netmapClientWrapper{
		netmapClient: netmapClient,
	}
}

type netmapClientWrapper struct {
	netmapClient *netmapclient.Client
}

func (w *netmapClientWrapper) UpdatePeerState(p netmapclient.UpdatePeerPrm) error {
	return w.netmapClient.UpdatePeerState(p)
}

func (w *netmapClientWrapper) MorphNotaryInvoke(contract util.Uint160, fee fixedn.Fixed8, nonce uint32, vub *uint32, method string, args ...any) error {
	return w.netmapClient.Morph().NotaryInvoke(contract, fee, nonce, vub, method, args...)
}

func (w *netmapClientWrapper) ContractAddress() util.Uint160 {
	return w.netmapClient.ContractAddress()
}

func (w *netmapClientWrapper) EpochDuration() (uint64, error) {
	return w.netmapClient.EpochDuration()
}

func (w *netmapClientWrapper) MorphTxHeight(h util.Uint256) (res uint32, err error) {
	return w.netmapClient.Morph().TxHeight(h)
}

func (w *netmapClientWrapper) NetMap() (*netmap.NetMap, error) {
	return w.netmapClient.NetMap()
}

func (w *netmapClientWrapper) NewEpoch(epoch uint64, force bool) error {
	return w.netmapClient.NewEpoch(epoch, force)
}

func (w *netmapClientWrapper) MorphIsValidScript(script []byte, signers []transaction.Signer) (valid bool, err error) {
	return w.netmapClient.Morph().IsValidScript(script, signers)
}

func (w *netmapClientWrapper) AddPeer(p netmapclient.AddPeerPrm) error {
	return w.netmapClient.AddPeer(p)
}

func (w *netmapClientWrapper) MorphNotarySignAndInvokeTX(mainTx *transaction.Transaction) error {
	return w.netmapClient.Morph().NotarySignAndInvokeTX(mainTx)
}