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

import (
	"fmt"

	"github.com/gdamore/tcell"
	"p78git.ddns.net/svi/libtui/alias"
	"p78git.ddns.net/svi/libtui/cell"
	"p78git.ddns.net/svi/libtui/safe_bool"
	"p78git.ddns.net/svi/libtui/types"
	"p78git.ddns.net/svi/libtui/widget"
)

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

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

// IsVisible -- возвращает признак видимости окна экрана
func (sf *WinDebug) IsVisible() bool {
	return sf.isVisible.Get()
}

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

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

// 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.isVisible.Get() {
		return
	}
	color := tcell.NewRGBColor(0, 0, 255)
	// style := tcell.StyleDefault
	// style = style.Background(color)
	posX, posY := sf.Pos()
	sf.Widget.Draw()
	strOut := fmt.Sprintf("WinDebug.Draw(): pos=%v:%v", posX, posY)
	color1 := tcell.NewRGBColor(200, 200, 200)
	style1 := tcell.StyleDefault
	style1 = style1.Foreground(color1).Background(color)
	sf.drawText(style1, strOut)
}

func (sf *WinDebug) drawText(style tcell.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))
		sf.screen.SetCell(cell)
	}
}
