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

import (
	"fmt"

	"gitp78su.ipnodns.ru/svi/kern/v3"

	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
	"gitp78su.ipnodns.ru/svi/goarch/lev1/view_node"
)

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

var (
	hassert = kern.GetFnHassert()
)

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

// SelfCheck -- проверяет корректность размера
func (sf *ViewSize) 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 *ViewSize) String() string {
	return fmt.Sprintf("size:%vx%v", sf.W_, sf.H_)
}

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

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

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

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