package container

import (
	"errors"

	"github.com/nspcc-dev/neofs-node/pkg/core/container/acl/basic"
	"github.com/nspcc-dev/netmap"
)

// BasicACL represents the basic
// ACL rules.
//
// It is a type alias of
// github.com/nspcc-dev/neofs-node/pkg/core/container/basic.ACL.
type BasicACL = basic.ACL

// PlacementRule represents placement
// rules of the container.
//
// It is a type alias of
// github.com/nspcc-dev/netmap.PlacementRule.
// FIXME: container placement rules should be defined in core lib.
type PlacementRule = netmap.PlacementRule

// Container represents NeoFS container.
type Container struct {
	basicACL BasicACL // basic ACL mask

	ownerID OwnerID // the identifier of container's owner

	salt []byte // unique container bytes

	placementRule PlacementRule // placement rules
}

// ErrNilContainer is the error returned by functions that
// expect a non-nil container pointer, but received nil.
var ErrNilContainer = errors.New("container is nil")

// OwnerID returns an ID of the container's owner.
func (c *Container) OwnerID() OwnerID {
	return c.ownerID
}

// SetOwnerID sets the ID of the container's owner.
func (c *Container) SetOwnerID(v OwnerID) {
	c.ownerID = v
}

// Salt returns the container salt.
//
// Slice is returned by reference without copying.
func (c *Container) Salt() []byte {
	return c.salt
}

// SetSalt sets the container salt.
//
// Slice is assigned by reference without copying.
func (c *Container) SetSalt(v []byte) {
	c.salt = v
}

// BasicACL returns the mask of basic container permissions.
func (c *Container) BasicACL() BasicACL {
	return c.basicACL
}

// SetBasicACL sets the mask of basic container permissions.
func (c *Container) SetBasicACL(v BasicACL) {
	c.basicACL = v
}

// PlacementRule returns placement rule of the container.
func (c *Container) PlacementRule() PlacementRule {
	return c.placementRule
}

// SetPlacementRule sets placement rule of the container.
func (c *Container) SetPlacementRule(v PlacementRule) {
	c.placementRule = v
}