package container

import (
	"context"
)

// GetParams is a group of parameters for container receiving operation.
type GetParams struct {
	ctxValue

	cidValue
}

// GetResult is a group of values returned by container receiving operation.
type GetResult struct {
	cnrValue
}

// PutParams is a group of parameters for container storing operation.
type PutParams struct {
	ctxValue

	cnrValue
}

// PutResult is a group of values returned by container storing operation.
type PutResult struct {
	cidValue
}

// DeleteParams is a group of parameters for container removal operation.
type DeleteParams struct {
	ctxValue

	cidValue

	ownerID OwnerID
}

// DeleteResult is a group of values returned by container removal operation.
type DeleteResult struct{}

// ListParams is a group of parameters for container listing operation.
type ListParams struct {
	ctxValue

	ownerIDList []OwnerID
}

// ListResult is a group of values returned by container listing operation.
type ListResult struct {
	cidList []CID
}

type cnrValue struct {
	cnr *Container
}

type cidValue struct {
	cid CID
}

type ctxValue struct {
	ctx context.Context
}

// Storage is an interface of the storage of NeoFS containers.
type Storage interface {
	GetContainer(GetParams) (*GetResult, error)
	PutContainer(PutParams) (*PutResult, error)
	DeleteContainer(DeleteParams) (*DeleteResult, error)
	ListContainers(ListParams) (*ListResult, error)
	// TODO: add EACL methods
}

// Context is a context getter.
func (s ctxValue) Context() context.Context {
	return s.ctx
}

// SetContext is a context setter.
func (s *ctxValue) SetContext(v context.Context) {
	s.ctx = v
}

// CID is a container ID getter.
func (s cidValue) CID() CID {
	return s.cid
}

// SetCID is a container ID getter.
func (s *cidValue) SetCID(v CID) {
	s.cid = v
}

// Container is a container getter.
func (s cnrValue) Container() *Container {
	return s.cnr
}

// SetContainer is a container setter.
func (s *cnrValue) SetContainer(v *Container) {
	s.cnr = v
}

// OwnerID is an owner ID getter.
func (s DeleteParams) OwnerID() OwnerID {
	return s.ownerID
}

// SetOwnerID is an owner ID setter.
func (s *DeleteParams) SetOwnerID(v OwnerID) {
	s.ownerID = v
}

// OwnerIDList is an owner ID list getter.
func (s ListParams) OwnerIDList() []OwnerID {
	return s.ownerIDList
}

// SetOwnerIDList is an owner ID list setter.
func (s *ListParams) SetOwnerIDList(v ...OwnerID) {
	s.ownerIDList = v
}

// CIDList is a container ID list getter.
func (s ListResult) CIDList() []CID {
	return s.cidList
}

// SetCIDList is a container ID list setter.
func (s *ListResult) SetCIDList(v []CID) {
	s.cidList = v
}