package object

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

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

// NewRawFromV2 constructs RawObject instance from v2 Object message.
func NewRawFromV2(obj *objectV2.Object) *RawObject {
	return &RawObject{
		RawObject: object.NewRawFromV2(obj),
	}
}

// NewRawFrom constructs RawObject instance from NeoFS SDK RawObject.
func NewRawFrom(obj *object.RawObject) *RawObject {
	return &RawObject{
		RawObject: obj,
	}
}

// NewRawFromObject wraps Object instance to RawObject.
func NewRawFromObject(obj *Object) *RawObject {
	return NewRawFrom(object.NewRawFrom(obj.SDK()))
}

// NewRaw constructs blank RawObject instance.
func NewRaw() *RawObject {
	return NewRawFrom(object.NewRaw())
}

// SDK converts RawObject to NeoFS SDK RawObject instance.
func (o *RawObject) SDK() *object.RawObject {
	if o != nil {
		return o.RawObject
	}

	return nil
}

// Object converts RawObject to read-only Object instance.
func (o *RawObject) Object() *Object {
	if o != nil {
		return &Object{
			Object: o.RawObject.Object(),
		}
	}

	return nil
}

// CutPayload returns RawObject w/ empty payload.
//
// Changes of non-payload fields affect source object.
func (o *RawObject) CutPayload() *RawObject {
	if o != nil {
		return &RawObject{
			RawObject: o.RawObject.CutPayload(),
		}
	}

	return nil
}