package morphsubnet

import (
	"errors"

	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
)

// GetPrm groups parameters of Get method of Subnet contract.
type GetPrm struct {
	args [1]any
}

// SetID sets identifier of the subnet to be read in a binary FrostFS API protocol format.
func (x *GetPrm) SetID(id []byte) {
	x.args[0] = id
}

// GetRes groups the resulting values of Get method of Subnet contract.
type GetRes struct {
	info []byte
}

// Info returns information about the subnet in a binary format of FrostFS API protocol.
func (x GetRes) Info() []byte {
	return x.info
}

var errEmptyResponse = errors.New("empty response")

// Get reads the subnet through the call of the corresponding method of the Subnet contract.
func (x *Client) Get(prm GetPrm) (*GetRes, error) {
	var prmGet client.TestInvokePrm

	prmGet.SetMethod(getMethod)
	prmGet.SetArgs(prm.args[:]...)

	res, err := x.client.TestInvoke(prmGet)
	if err != nil {
		return nil, err
	}

	if len(res) == 0 {
		return nil, errEmptyResponse
	}

	data, err := client.BytesFromStackItem(res[0])
	if err != nil {
		return nil, err
	}

	return &GetRes{
		info: data,
	}, nil
}