package object

import (
	"github.com/nspcc-dev/neofs-api-go/pkg/object"
	objectV2 "github.com/nspcc-dev/neofs-api-go/v2/object"
)

// Object represents the NeoFS object.
//
// Object inherits object type from NeoFS SDK.
// It is used to implement some useful methods and functions
// for convenient processing of an object by a node.
type Object struct {
	*object.Object
}

// MarshalStableV2 marshals Object to v2 binary format.
func (o *Object) MarshalStableV2() ([]byte, error) {
	if o != nil {
		return o.ToV2().StableMarshal(nil)
	}

	return nil, nil
}

// Address returns address of the object.
func (o *Object) Address() *Address {
	if o != nil {
		return &Address{
			Address: o.Object.Address(),
		}
	}

	return nil
}

// FromV2 converts v2 Object message to Object.
func FromV2(oV2 *objectV2.Object) (*Object, error) {
	if oV2 == nil {
		return nil, nil
	}

	o, err := object.FromV2(oV2)
	if err != nil {
		return nil, err
	}

	return &Object{
		Object: o,
	}, nil
}

// FromBytes restores Object from binary format.
func FromBytes(data []byte) (*Object, error) {
	o, err := object.FromBytes(data)
	if err != nil {
		return nil, err
	}

	return &Object{
		Object: o,
	}, nil
}