package container

import (
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/netmap"
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/refs"
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/session"
)

type Attribute struct {
	key, val string
}

type Container struct {
	version *refs.Version

	ownerID *refs.OwnerID

	nonce []byte

	basicACL uint32

	attr []Attribute

	policy *netmap.PlacementPolicy
}

type PutRequestBody struct {
	cnr *Container

	sig *refs.Signature
}
type PutRequest struct {
	body *PutRequestBody

	session.RequestHeaders
}

type PutResponseBody struct {
	cid *refs.ContainerID
}

type PutResponse struct {
	body *PutResponseBody

	session.ResponseHeaders
}

type GetRequestBody struct {
	cid *refs.ContainerID
}

type GetRequest struct {
	body *GetRequestBody

	session.RequestHeaders
}

type GetResponseBody struct {
	cnr *Container

	token *session.Token

	sig *refs.Signature
}

type GetResponse struct {
	body *GetResponseBody

	session.ResponseHeaders
}

type DeleteRequestBody struct {
	cid *refs.ContainerID

	sig *refs.Signature
}

type DeleteRequest struct {
	body *DeleteRequestBody

	session.RequestHeaders
}

type DeleteResponseBody struct{}

type DeleteResponse struct {
	body *DeleteResponseBody

	session.ResponseHeaders
}

type ListRequestBody struct {
	ownerID *refs.OwnerID
}

type ListRequest struct {
	body *ListRequestBody

	session.RequestHeaders
}

type ListResponseBody struct {
	cidList []refs.ContainerID
}

type ListResponse struct {
	body *ListResponseBody

	session.ResponseHeaders
}

func (a *Attribute) GetKey() string {
	if a != nil {
		return a.key
	}

	return ""
}

func (a *Attribute) SetKey(v string) {
	a.key = v
}

func (a *Attribute) GetValue() string {
	if a != nil {
		return a.val
	}

	return ""
}

func (a *Attribute) SetValue(v string) {
	a.val = v
}

func (c *Container) GetVersion() *refs.Version {
	if c != nil {
		return c.version
	}

	return nil
}

func (c *Container) SetVersion(v *refs.Version) {
	c.version = v
}

func (c *Container) GetOwnerID() *refs.OwnerID {
	if c != nil {
		return c.ownerID
	}

	return nil
}

func (c *Container) SetOwnerID(v *refs.OwnerID) {
	c.ownerID = v
}

func (c *Container) GetNonce() []byte {
	if c != nil {
		return c.nonce
	}

	return nil
}

func (c *Container) SetNonce(v []byte) {
	c.nonce = v
}

func (c *Container) GetBasicACL() uint32 {
	if c != nil {
		return c.basicACL
	}

	return 0
}

func (c *Container) SetBasicACL(v uint32) {
	c.basicACL = v
}

func (c *Container) GetAttributes() []Attribute {
	if c != nil {
		return c.attr
	}

	return nil
}

func (c *Container) SetAttributes(v []Attribute) {
	c.attr = v
}

func (c *Container) GetPlacementPolicy() *netmap.PlacementPolicy {
	if c != nil {
		return c.policy
	}

	return nil
}

func (c *Container) SetPlacementPolicy(v *netmap.PlacementPolicy) {
	c.policy = v
}

func (r *PutRequestBody) GetContainer() *Container {
	if r != nil {
		return r.cnr
	}

	return nil
}

func (r *PutRequestBody) SetContainer(v *Container) {
	r.cnr = v
}

func (r *PutRequestBody) GetSignature() *refs.Signature {
	if r != nil {
		return r.sig
	}

	return nil
}

func (r *PutRequestBody) SetSignature(v *refs.Signature) {
	// TODO: (neofs-api-go#381) avoid this hack (e.g. create refs.SignatureRFC6979 type)
	v.SetScheme(0)
	r.sig = v
}

func (r *PutRequest) GetBody() *PutRequestBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *PutRequest) SetBody(v *PutRequestBody) {
	r.body = v
}

func (r *PutResponseBody) GetContainerID() *refs.ContainerID {
	if r != nil {
		return r.cid
	}

	return nil
}

func (r *PutResponseBody) SetContainerID(v *refs.ContainerID) {
	r.cid = v
}

func (r *PutResponse) GetBody() *PutResponseBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *PutResponse) SetBody(v *PutResponseBody) {
	r.body = v
}

func (r *GetRequestBody) GetContainerID() *refs.ContainerID {
	if r != nil {
		return r.cid
	}

	return nil
}

func (r *GetRequestBody) SetContainerID(v *refs.ContainerID) {
	r.cid = v
}

func (r *GetRequest) GetBody() *GetRequestBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *GetRequest) SetBody(v *GetRequestBody) {
	r.body = v
}

func (r *GetResponseBody) GetContainer() *Container {
	if r != nil {
		return r.cnr
	}

	return nil
}

func (r *GetResponseBody) SetContainer(v *Container) {
	r.cnr = v
}

// GetSessionToken returns token of the session within which requested
// container was created.
func (r *GetResponseBody) GetSessionToken() *session.Token {
	if r != nil {
		return r.token
	}

	return nil
}

// SetSessionToken sets token of the session within which requested
// container was created.
func (r *GetResponseBody) SetSessionToken(v *session.Token) {
	r.token = v
}

// GetSignature returns signature of the requested container.
func (r *GetResponseBody) GetSignature() *refs.Signature {
	if r != nil {
		return r.sig
	}

	return nil
}

// SetSignature sets signature of the requested container.
func (r *GetResponseBody) SetSignature(v *refs.Signature) {
	// TODO: (neofs-api-go#381) avoid this hack (e.g. create refs.SignatureRFC6979 type)
	v.SetScheme(0)
	r.sig = v
}

func (r *GetResponse) GetBody() *GetResponseBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *GetResponse) SetBody(v *GetResponseBody) {
	r.body = v
}

func (r *DeleteRequestBody) GetContainerID() *refs.ContainerID {
	if r != nil {
		return r.cid
	}

	return nil
}

func (r *DeleteRequestBody) SetContainerID(v *refs.ContainerID) {
	r.cid = v
}

func (r *DeleteRequestBody) GetSignature() *refs.Signature {
	if r != nil {
		return r.sig
	}

	return nil
}

func (r *DeleteRequestBody) SetSignature(v *refs.Signature) {
	// TODO: (neofs-api-go#381) avoid this hack (e.g. create refs.SignatureRFC6979 type)
	v.SetScheme(0)
	r.sig = v
}

func (r *DeleteRequest) GetBody() *DeleteRequestBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *DeleteRequest) SetBody(v *DeleteRequestBody) {
	r.body = v
}

func (r *DeleteResponse) GetBody() *DeleteResponseBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *DeleteResponse) SetBody(v *DeleteResponseBody) {
	r.body = v
}

func (r *ListRequestBody) GetOwnerID() *refs.OwnerID {
	if r != nil {
		return r.ownerID
	}

	return nil
}

func (r *ListRequestBody) SetOwnerID(v *refs.OwnerID) {
	r.ownerID = v
}

func (r *ListRequest) GetBody() *ListRequestBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *ListRequest) SetBody(v *ListRequestBody) {
	r.body = v
}

func (r *ListResponseBody) GetContainerIDs() []refs.ContainerID {
	if r != nil {
		return r.cidList
	}

	return nil
}

func (r *ListResponseBody) SetContainerIDs(v []refs.ContainerID) {
	r.cidList = v
}

func (r *ListResponse) GetBody() *ListResponseBody {
	if r != nil {
		return r.body
	}

	return nil
}

func (r *ListResponse) SetBody(v *ListResponseBody) {
	r.body = v
}