package container

import (
	"crypto/sha256"

	"github.com/nspcc-dev/neofs-api-go/v2/container"
)

type Container struct {
	container.Container
}

func New(opts ...NewOption) *Container {
	cnrOptions := defaultContainerOptions()
	for i := range opts {
		opts[i].apply(&cnrOptions)
	}

	cnr := new(Container)
	cnr.SetNonce(cnrOptions.nonce[:])
	cnr.SetBasicACL(cnrOptions.acl)

	if cnrOptions.owner != nil {
		cnr.SetOwnerID(cnrOptions.owner.ToV2())
	}

	if cnrOptions.policy != nil {
		cnr.SetPlacementPolicy(cnrOptions.policy)
	}

	attributes := make([]*container.Attribute, len(cnrOptions.attributes))
	for i := range cnrOptions.attributes {
		attribute := new(container.Attribute)
		attribute.SetKey(cnrOptions.attributes[i].key)
		attribute.SetValue(cnrOptions.attributes[i].value)
		attributes[i] = attribute
	}
	if len(attributes) > 0 {
		cnr.SetAttributes(attributes)
	}

	return cnr
}

func (c Container) ToV2() *container.Container {
	return &c.Container
}

func NewContainerFromV2(c *container.Container) *Container {
	cnr := new(Container)

	if c != nil {
		cnr.Container = *c
	}

	return cnr
}

// CalculateID calculates container identifier
// based on its structure.
func CalculateID(c *Container) *ID {
	data, err := c.ToV2().StableMarshal(nil)
	if err != nil {
		panic(err)
	}

	id := NewID()
	id.SetSHA256(sha256.Sum256(data))

	return id
}