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

import (
	svg "github.com/ajstarks/svgo"
	"gitp78su.ipnodns.ru/svi/kern/v3"

	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
	"gitp78su.ipnodns.ru/svi/goarch/lev1/arch_link"
)

// ViewLink -- отображение связи между объектами
type ViewLink struct {
	*arch_link.ArchLink
	Coord_    types.IViewCoord
	CoordEnd_ types.IViewCoord
	Offset_   types.IViewOffset
}

var (
	hassert = kern.GetFnHassert()
)

// NewViewLink -- возвращает новое отображение связи
func NewViewLink(archLink *arch_link.ArchLink, coord, coordEnd types.IViewCoord,
	offset types.IViewOffset) *ViewLink {
	hassert(archLink != nil, "NewViewLink: archLink == nil")
	hassert(coord != nil, "NewViewLink: coord == nil")
	hassert(offset != nil, "NewViewLink: offset == nil")
	sf := &ViewLink{
		ArchLink:  archLink,
		Coord_:    coord,
		CoordEnd_: coordEnd,
		Offset_:   offset,
	}
	return sf
}

// Draw -- рисует связь между объектами
func (sf *ViewLink) Draw(canvas *svg.SVG) {
	x, y := sf.Coord_.Int()
	x1, y1 := sf.CoordEnd_.Int()
	offX, offY := sf.Offset_.Int()
	// Линия
	canvas.Line(x, y, x1, y1, "stroke:black;stroke-width:1")
	strLabel := sf.String()
	if strLabel != "" {
		canvas.Text(x+offX, y+offY, strLabel, "font-size: 12px; font-family: Courier; fill: black")
	}
	if sf.TypeLink() != "" {
		canvas.Text(x+offX, y+offY+12, "<<"+sf.TypeLink()+">>", "font-size: 12px; font-family: Courier; fill: black")
	}
	if msgErr := sf.Check(); msgErr != "" { // Проверка на правильность
		canvas.Group("Ошибка")
		canvas.Title(msgErr)
		canvas.Image(x-20+offX, y-20+offY, 16, 16, "/static/img/warning.png")
	}
	canvas.Gend() // Group end
}

// CoordEnd -- координаты конца связи
//
//go:fix inline
func (sf *ViewLink) CoordEnd() types.IViewCoord {
	return sf.CoordEnd_
}
