package accounting

import (
	"github.com/nspcc-dev/neofs-api-go/v2/accounting"
)

// Decimal represents v2-compatible decimal number.
type Decimal accounting.Decimal

// NewDecimal creates, initializes and returns blank Decimal instance.
func NewDecimal() *Decimal {
	return NewDecimalFromV2(new(accounting.Decimal))
}

// NewDecimalFromV2 converts v2 Decimal to Decimal.
func NewDecimalFromV2(d *accounting.Decimal) *Decimal {
	return (*Decimal)(d)
}

// Value returns value of the decimal number.
func (d *Decimal) Value() int64 {
	return (*accounting.Decimal)(d).
		GetValue()
}

// SetValue sets value of the decimal number.
func (d *Decimal) SetValue(v int64) {
	(*accounting.Decimal)(d).
		SetValue(v)
}

// Precision returns precision of the decimal number.
func (d *Decimal) Precision() uint32 {
	return (*accounting.Decimal)(d).
		GetPrecision()
}

// SetPrecision sets precision of the decimal number.
func (d *Decimal) SetPrecision(p uint32) {
	(*accounting.Decimal)(d).
		SetPrecision(p)
}

// Marshal marshals Decimal into a protobuf binary form.
//
// Buffer is allocated when the argument is empty.
// Otherwise, the first buffer is used.
func (d *Decimal) Marshal(b ...[]byte) ([]byte, error) {
	var buf []byte
	if len(b) > 0 {
		buf = b[0]
	}

	return (*accounting.Decimal)(d).
		StableMarshal(buf)
}

// Unmarshal unmarshals protobuf binary representation of Decimal.
func (d *Decimal) Unmarshal(data []byte) error {
	return (*accounting.Decimal)(d).
		Unmarshal(data)
}

// MarshalJSON encodes Decimal to protobuf JSON format.
func (d *Decimal) MarshalJSON() ([]byte, error) {
	return (*accounting.Decimal)(d).
		MarshalJSON()
}

// UnmarshalJSON decodes Decimal from protobuf JSON format.
func (d *Decimal) UnmarshalJSON(data []byte) error {
	return (*accounting.Decimal)(d).
		UnmarshalJSON(data)
}