package wrappers

import (
	"github.com/CityOfZion/neo-go/pkg/core"
	"github.com/CityOfZion/neo-go/pkg/core/transaction"
	"github.com/CityOfZion/neo-go/pkg/crypto"
	"github.com/CityOfZion/neo-go/pkg/util"
)

// AssetState wrapper used for the representation of
// core.AssetState on the RPC Server.
type AssetState struct {
	ID         util.Uint256          `json:"assetId"`
	AssetType  transaction.AssetType `json:"assetType"`
	Name       string                `json:"name"`
	Amount     util.Fixed8           `json:"amount"`
	Available  util.Fixed8           `json:"available"`
	Precision  uint8                 `json:"precision"`
	FeeMode    uint8                 `json:"fee"`
	FeeAddress util.Uint160          `json:"address"`
	Owner      string                `json:"owner"`
	Admin      string                `json:"admin"`
	Issuer     string                `json:"issuer"`
	Expiration uint32                `json:"expiration"`
	IsFrozen   bool                  `json:"is_frozen"`
}

// NewAssetState creates a new AssetState wrapper.
func NewAssetState(a *core.AssetState) AssetState {
	return AssetState{
		ID:         a.ID,
		AssetType:  a.AssetType,
		Name:       a.GetName(),
		Amount:     a.Amount,
		Available:  a.Available,
		Precision:  a.Precision,
		FeeMode:    a.FeeMode,
		FeeAddress: a.FeeAddress,
		Owner:      a.Owner.String(),
		Admin:      crypto.AddressFromUint160(a.Admin),
		Issuer:     crypto.AddressFromUint160(a.Issuer),
		Expiration: a.Expiration,
		IsFrozen:   a.IsFrozen,
	}
}