package apemanager

import (
	"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
)

type TargetType uint32

const (
	TargetTypeUndefined TargetType = iota
	TargetTypeNamespace
	TargetTypeContainer
	TargetTypeUser
	TargetTypeGroup
)

type ChainTarget struct {
	targeType TargetType

	name string
}

func (ct *ChainTarget) SetTargetType(targeType TargetType) {
	ct.targeType = targeType
}

func (ct *ChainTarget) SetName(name string) {
	ct.name = name
}

func (ct *ChainTarget) GetTargetType() TargetType {
	if ct != nil {
		return ct.targeType
	}

	return 0
}

func (ct *ChainTarget) GetName() string {
	if ct != nil {
		return ct.name
	}

	return ""
}

type AddChainRequest struct {
	body *AddChainRequestBody

	session.RequestHeaders
}

func (r *AddChainRequest) SetBody(body *AddChainRequestBody) {
	r.body = body
}

func (r *AddChainRequest) GetBody() *AddChainRequestBody {
	return r.body
}

type chainKind interface {
	isChainKind()
}

type Chain struct {
	kind chainKind
}

func (c *Chain) SetKind(kind chainKind) {
	c.kind = kind
}

func (c *Chain) GetKind() chainKind {
	return c.kind
}

type ChainRaw struct {
	Raw []byte
}

func (*ChainRaw) isChainKind() {}

func (c *ChainRaw) SetRaw(raw []byte) {
	c.Raw = raw
}

func (c *ChainRaw) GetRaw() []byte {
	return c.Raw
}

type AddChainRequestBody struct {
	target *ChainTarget

	chain *Chain
}

func (rb *AddChainRequestBody) SetTarget(target *ChainTarget) {
	rb.target = target
}

func (rb *AddChainRequestBody) GetTarget() *ChainTarget {
	return rb.target
}

func (rb *AddChainRequestBody) SetChain(chain *Chain) {
	rb.chain = chain
}

func (rb *AddChainRequestBody) GetChain() *Chain {
	return rb.chain
}

type AddChainResponse struct {
	body *AddChainResponseBody

	session.ResponseHeaders
}

func (r *AddChainResponse) SetBody(body *AddChainResponseBody) {
	r.body = body
}

func (r *AddChainResponse) GetBody() *AddChainResponseBody {
	return r.body
}

type AddChainResponseBody struct {
	chainID []byte
}

func (rb *AddChainResponseBody) SetChainID(chainID []byte) {
	rb.chainID = chainID
}

func (rb *AddChainResponseBody) GetChainID() []byte {
	return rb.chainID
}

type RemoveChainRequest struct {
	body *RemoveChainRequestBody

	session.RequestHeaders
}

func (r *RemoveChainRequest) SetBody(body *RemoveChainRequestBody) {
	r.body = body
}

func (r *RemoveChainRequest) GetBody() *RemoveChainRequestBody {
	return r.body
}

type RemoveChainRequestBody struct {
	target *ChainTarget

	chainID []byte
}

func (rb *RemoveChainRequestBody) SetTarget(target *ChainTarget) {
	rb.target = target
}

func (rb *RemoveChainRequestBody) GetTarget() *ChainTarget {
	return rb.target
}

func (rb *RemoveChainRequestBody) SetChainID(chainID []byte) {
	rb.chainID = chainID
}

func (rb *RemoveChainRequestBody) GetChainID() []byte {
	return rb.chainID
}

type RemoveChainResponse struct {
	body *RemoveChainResponseBody

	session.ResponseHeaders
}

type RemoveChainResponseBody struct {
}

func (r *RemoveChainResponse) SetBody(body *RemoveChainResponseBody) {
	r.body = body
}

func (r *RemoveChainResponse) GetBody() *RemoveChainResponseBody {
	return r.body
}

type ListChainsRequest struct {
	body *ListChainsRequestBody

	session.RequestHeaders
}

func (r *ListChainsRequest) SetBody(body *ListChainsRequestBody) {
	r.body = body
}

func (r *ListChainsRequest) GetBody() *ListChainsRequestBody {
	return r.body
}

type ListChainsRequestBody struct {
	target *ChainTarget
}

func (rb *ListChainsRequestBody) SetTarget(target *ChainTarget) {
	rb.target = target
}

func (rb *ListChainsRequestBody) GetTarget() *ChainTarget {
	return rb.target
}

type ListChainsResponse struct {
	body *ListChainsResponseBody

	session.ResponseHeaders
}

func (r *ListChainsResponse) SetBody(body *ListChainsResponseBody) {
	r.body = body
}

func (r *ListChainsResponse) GetBody() *ListChainsResponseBody {
	return r.body
}

type ListChainsResponseBody struct {
	chains []*Chain

	session.RequestHeaders
}

func (r *ListChainsResponseBody) SetChains(chains []*Chain) {
	r.chains = chains
}

func (r *ListChainsResponseBody) GetChains() []*Chain {
	return r.chains
}