// package elem_label -- текстовая метка для отображения
package elem_label

import (
	svg "github.com/ajstarks/svgo"
	"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/elem_base"
)

// ElemLabel -- текстовая метка для отображения
type ElemLabel struct {
	types.IElemBase
	Val_    alias.Label   `yaml:"val"`    // Метка для вывода
	Offset_ types.IOffset `yaml:"offset"` // Смещение метки
}

var (
	hassert = kern.GetFnHassert()
)

// NewElemLabel -- возвращает новую метку
func NewElemLabel(label alias.Label, coord types.ICoord, offset types.IOffset) types.IElemLabel {
	sf := &ElemLabel{
		IElemBase: elem_base.NewElemBase(coord, "elem_label"),
		Val_:      label,
		Offset_:   offset,
	}
	sf.SelfCheck()
	return sf
}

// Draw -- отрисовка метки
func (sf *ElemLabel) Draw(canvas *svg.SVG) {
	strLabel := sf.String()
	if strLabel != "" {
		x, y := sf.Offset_.Int()
		offX := int(sf.Offset_.X())
		canvas.Text(x+offX, y-8, strLabel,
			"font-size: 14px; font-family: Courier; fill: black")
	}
}

// SelfCheck -- самопроверка типа
func (sf *ElemLabel) SelfCheck() {
	sf.IElemBase.SelfCheck()
	hassert(sf.Offset_ != nil, "SelfCheck(): Offset_ is nil")
}

// String -- возвращает метку
//
//go:fix inline
func (sf *ElemLabel) String() string {
	return string(sf.Val_)
}

// Get -- возвращает метку
//
//go:fix inline
func (sf *ElemLabel) Get() alias.Label {
	return sf.Val_
}

// Offset -- возвращает смещение метки
//
//go:fix inline
func (sf *ElemLabel) Offset() types.IOffset {
	return sf.Offset_
}
