// package coord -- координаты точки
package coord

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

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

// NewCoord -- возвращает новую координаты
func NewCoord(key string, elem map[string]interface{}) *Coord {
	var _lstCoord []interface{}
	_coord0, isOk := elem[key]
	if !isOk {
		_lstCoord = []interface{}{200, 200}
	} else {
		fnConvert := func() {
			defer func() {
				if _panic := recover(); _panic != nil {
					_lstCoord = []interface{}{200, 200}
				}
			}()
			_lstCoord = _coord0.([]interface{})
		}
		fnConvert()
	}

	x := alias.CoordX(200)
	y := alias.CoordY(200)
	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 := &Coord{
		X_: x,
		Y_: y,
	}
	return sf
}

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

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

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