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

import (
	"gitp78su.ipnodns.ru/svi/test_arch/lev0/alias"
)

// Size -- размер области
type Size struct {
	W_ alias.Width  `json:"w"` // Высота
	H_ alias.Height `json:"h"` // Ширина
}

// NewSize -- возвращает новый размер
func NewSize(key string, elem map[string]interface{}) *Size {
	var _lstSize []interface{}
	_size0, isOk := elem[key]
	if !isOk {
		_lstSize = []interface{}{400, 300}
	} else {
		fnConvert := func() {
			defer func() {
				if _panic := recover(); _panic != nil {
					_lstSize = []interface{}{400, 300}
				}
			}()
			_lstSize = _size0.([]interface{})
		}
		fnConvert()
	}

	w := alias.Width(400)
	h := alias.Height(300)
	if len(_lstSize) >= 2 {
		switch _lstSize[0].(type) {
		case int:
			w = alias.Width(_lstSize[0].(int))
			h = alias.Height(_lstSize[1].(int))
		case float64:
			fnConvert := func() {
				defer func() {
					if _panic := recover(); _panic != nil {
						w = alias.Width(400)
						h = alias.Height(300)
					}
				}()
				w = alias.Width(int(_lstSize[0].(float64)))
				h = alias.Height(int(_lstSize[1].(float64)))
			}
			fnConvert()
		}
	}
	sf := &Size{
		W_: w,
		H_: h,
	}
	return sf
}

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

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

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