package vo

import "fmt"

// BlockHeight is a value object representing a blockchain block height (number).
// Block heights must be non-negative.
type BlockHeight struct {
	value int64
}

// NewBlockHeight creates a validated BlockHeight value object.
func NewBlockHeight(height int64) (BlockHeight, error) {
	if height < 0 {
		return BlockHeight{}, fmt.Errorf("block height must be non-negative, got %d", height)
	}
	return BlockHeight{value: height}, nil
}

// Value returns the underlying int64 value.
func (h BlockHeight) Value() int64 {
	return h.value
}

// IsGenesis reports whether this is the genesis block (height 0).
func (h BlockHeight) IsGenesis() bool {
	return h.value == 0
}

// Next returns the next block height.
func (h BlockHeight) Next() BlockHeight {
	return BlockHeight{value: h.value + 1}
}

// String returns the string representation.
func (h BlockHeight) String() string {
	return fmt.Sprintf("%d", h.value)
}

// IsValid reports whether the block height is valid (non-negative).
func (h BlockHeight) IsValid() bool {
	return h.value >= 0
}
