// package view_link -- отображение связи между объектами
package view_link

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"
)

// ViewLink -- отображение связи между объектами
type ViewLink struct {
	types.IElemLink
}

var (
	hassert = kern.GetFnHassert()
)

// NewViewLink -- возвращает новое отображение связи
func NewViewLink(useLink types.IElemLink) *ViewLink {
	hassert(useLink != nil, "NewViewLink: useLink is nil")
	sf := &ViewLink{
		IElemLink: useLink,
	}
	return sf
}

// Draw -- рисует связь между объектами
func (sf *ViewLink) Draw(canvas *svg.SVG, mapDrawer map[alias.Id]types.IDrawer) {
	x, y := sf.Label().Coord().Int()
	_x, _y = sf.CoordEnd().Coord()
	x1 := int(_x)
	y1 := int(_y)
	_x, _y = sf.UseLink_.ElemBase_.Label_.Offset_.Offset()
	offX := int(_x)
	offY := int(_y)
	// Линия
	canvas.Line(x, y, x1, y1, "stroke:black;stroke-width:1")
	strLabel := string(sf.UseLink_.ElemBase_.Label_.Val_)
	if strLabel != "" {
		canvas.Text(x+offX, y+offY, strLabel, "font-size: 12px; font-family: Courier; fill: black")
	}
	strTypeLink := string(sf.UseLink_.TypeLink_)
	if strTypeLink != "" {
		canvas.Text(x+offX, y+offY+12, "<<"+strTypeLink+">>", "font-size: 12px; font-family: Courier; fill: black")
	}
	if msgErr := sf.UseLink_.ElemBase_.Check(mapDrawer); msgErr != "" { // Проверка на правильность
		canvas.Group("Ошибка")
		canvas.Title(msgErr)
		canvas.Image(x-20+offX, y-20+offY, 16, 16, "/static/img/warning.png")
		canvas.Gend() // Group end
	}
}

// SrcId -- возвращает источник связи
func (sf *ViewLink) SrcId() alias.Id {
	return sf.Src_
}

// DstId -- возвращает получателя связи
func (sf *ViewLink) DstId() alias.Id {
	return sf.Dst_
}
