// package size -- размер области
package size

import (
	"fmt"

	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
	"gitp78su.ipnodns.ru/svi/kern/v3"
)

// Size -- размер области
type Size struct {
	W_ alias.SizeX
	H_ alias.SizeY
}

var (
	hassert = kern.GetFnHassert()
)

// NewSize -- возвращает новый размер
func NewSize(w alias.SizeX, h alias.SizeY) types.ISize {
	sf := &Size{
		W_: w,
		H_: h,
	}
	sf.SelfCheck()
	return sf
}

// SelfCheck -- проверяет корректность размера
func (sf *Size) SelfCheck() {
	hassert(sf.H_ >= 0, "Size.SelfCheck(): H_(%v)<0", sf.H_)
	hassert(sf.W_ >= 0, "Size.SelfCheck(): W_(%v)<0", sf.W_)
}

// String -- возвращает строковое представление размера
func (sf *Size) String() string {
	return fmt.Sprintf("size:%vx%v", sf.W_, sf.H_)
}

// W -- возвращает ширину
func (sf *Size) W() alias.SizeX {
	return sf.W_
}

// H -- возвращает высоту
func (sf *Size) H() alias.SizeY {
	return sf.H_
}

// Get -- возвращает размер
func (sf *Size) Get() (alias.SizeX, alias.SizeY) {
	return sf.W_, sf.H_
}

// Int -- возвращает размер
func (sf *Size) Int() (int, int) {
	return int(sf.W_), int(sf.H_)
}
