package netmap

import (
	"context"

	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(ctx context.Context, p netmapclient.UpdatePeerPrm) error {
	_, err := w.netmapClient.UpdatePeerState(ctx, p)
	return err
}

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

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

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

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

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

func (w *netmapClientWrapper) NewEpoch(ctx context.Context, epoch uint64) error {
	return w.netmapClient.NewEpoch(ctx, epoch)
}

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

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

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