// package win_debug -- окно отладки для экрана
package win_debug

import (
	"fmt"

	"github.com/gdamore/tcell"

	"p78git.ddns.net/svi/libtui/alias"
	"p78git.ddns.net/svi/libtui/lib/line_cell/cell"
	"p78git.ddns.net/svi/libtui/types"
	"p78git.ddns.net/svi/libtui/lib/widget"
)

// WinDebug -- окно отладки для экрана
type WinDebug struct {
	*widget.Widget
	app    types.IKernel
	screen types.IScreen
}

// NewWinDebug -- возвращает новое окно отладки для экрана
func NewWinDebug(app types.IKernel) (*WinDebug, error) {
	if app == nil {
		return nil, fmt.Errorf("NewWinDebug(): IApp==nil")
	}
	widget, err := widget.NewWidget(app)
	if err != nil {
		return nil, fmt.Errorf("NewWinDebug(): in create IWidget, err=\n\t%w", err)
	}
	sf := &WinDebug{
		Widget: widget,
		app:    app,
		screen: app.Screen(),
	}
	return sf, nil
}

// Hide -- скрыть окно отладки экрана
func (sf *WinDebug) Hide() {
	sf.Widget.Hide()
}

// Show -- показать окно отладки экрана
func (sf *WinDebug) Show() {
	sf.Widget.Show()
}

// SetPos -- устанавливает позицию окна отладки
func (sf *WinDebug) SetPos(x alias.PosX, y alias.PosY) {
	// Сначала вычислить квадрант экрана
	sizeX, sizeY := sf.app.Screen().Size()
	if alias.SizeX(x) >= sizeX/2 { // Кусор в правой половине
		x -= 30
	} else {
		x += 5
	}
	if alias.SizeY(y) >= sizeY/2 { // Курсор в нижней половине
		y -= 5
	} else {
		y += 5
	}
	sf.Widget.SetPos(x, y)
}

// Draw -- перерисовывает окноотладки по требованию
func (sf *WinDebug) Draw() {
	if !sf.Widget.IsVisible() {
		return
	}
	sf.Widget.Draw()

	posX, posY := sf.app.Cursor().Pos()
	strOut := fmt.Sprintf("WinDebug.Draw(): pos=%v:%v", posX, posY)
	colorFg := tcell.NewRGBColor(200, 200, 200)
	style1 := tcell.StyleDefault
	colorBg := tcell.NewRGBColor(0, 0, 255)
	style1 = style1.Foreground(colorFg).Background(colorBg)
	sf.drawText(alias.Style(style1), strOut)

}

func (sf *WinDebug) drawText(style alias.Style, text string) {
	posX, posY := sf.Pos()
	for adr, r := range text {
		cell := cell.NewCell()
		cell.SetPos(posX+alias.PosX(adr), posY)
		cell.SetLit(alias.Lit(r))
		cell.SetStyle(style)
		sf.screen.SetCell(cell)
	}
}
