// package offset -- смещение точки
package offset

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

// Offset -- смещение точки
type Offset struct {
	X_ alias.CoordX `json:"x"` // Координата X
	Y_ alias.CoordY `json:"y"` // Координата Y
}

// NewOffset -- возвращает новое смещение
func NewOffset(elem map[string]interface{}) *Offset {
	var _lstCoord []interface{}
	_coord0, isOk := elem["offset"]
	if !isOk {
		_lstCoord = []interface{}{100, 100}
	} else {
		_lstCoord = _coord0.([]interface{})
	}

	x := alias.CoordX(100)
	y := alias.CoordY(100)
	if len(_lstCoord) >= 2 {
		switch _lstCoord[0].(type) {
		case int:
			x = alias.CoordX(_lstCoord[0].(int))
			y = alias.CoordY(_lstCoord[1].(int))
		case float64:
			fnConvert := func() {
				defer func() {
					if _panic := recover(); _panic != nil {
						x = alias.CoordX(200)
						y = alias.CoordY(200)
					}
				}()
				x = alias.CoordX(int(_lstCoord[0].(float64)))
				y = alias.CoordY(int(_lstCoord[1].(float64)))
			}
			fnConvert()
		}
	}

	sf := &Offset{
		X_: x,
		Y_: y,
	}
	return sf
}

// Coord -- возвращает координаты
func (sf *Offset) Offset() (alias.CoordX, alias.CoordY) {
	return sf.X_, sf.Y_
}

// X -- возвращает координату X
func (sf *Offset) X() alias.CoordX {
	return sf.X_
}

// Y -- возвращает координату Y
func (sf *Offset) Y() alias.CoordY {
	return sf.Y_
}
