// package screen -- объект экрана
package screen

import (
	"fmt"

	"github.com/gdamore/tcell"
	"p78git.ddns.net/svi/libtui/alias"
	"p78git.ddns.net/svi/libtui/pos"
	"p78git.ddns.net/svi/libtui/screen/win_debug"
	"p78git.ddns.net/svi/libtui/size"
	"p78git.ddns.net/svi/libtui/types"
)

// Screen -- объект экрана
type Screen struct {
	app      types.IApp
	scr      tcell.Screen
	size     types.ISize     // Размер экрана
	winDebug types.IWinDebug // Окно отладки
	mousePos types.IPos      // Позиция мыши на экране
}

// NewScreen -- возвращаетновый экран
func NewScreen(app types.IApp) (*Screen, error) {
	if app == nil {
		return nil, fmt.Errorf("NewScreen(): IApp==nil")
	}
	sf := &Screen{
		app:      app,
		scr:      app.Scr(),
		size:     size.NewSize(),
		mousePos: pos.NewPos(),
	}
	var err error
	sf.winDebug, err = win_debug.NewWinDebug(sf)
	if err != nil {
		return nil, fmt.Errorf("NewScreen(): in creatre IWinDebug, err=\n\t%w", err)
	}
	return sf, nil
}

// Size -- возвращает размер экрана
func (sf *Screen) Size() (alias.SizeX, alias.SizeY) {
	return sf.size.Get()
}

// WinDebug -- возвращает объект окна отладки экрана
func (sf *Screen) WinDebug() types.IWinDebug {
	return sf.winDebug
}

// Resize -- изменяет размер экрана
func (sf *Screen) Resize(x alias.SizeX, y alias.SizeY) {
	sf.size.Set(x, y)
}

// SetMousePos -- устанавливает позицию мыши
func (sf *Screen) SetMousePos(x alias.PosX, y alias.PosY) {
	sf.mousePos.Set(x, y)
	if sf.winDebug.IsVisible() { // Установить позицию окна отладки, если оно видно
		sf.winDebug.SetPos(x, y)
	}
}

// App -- возвращает объект приложения
func (sf *Screen) App() types.IApp {
	return sf.app
}

// MousePos -- возвращает позицию мыши
func (sf *Screen) MousePos() (alias.PosX, alias.PosY) {
	return sf.mousePos.X().Get(), sf.mousePos.Y().Get()
}

// Set -- устанавливает ячейку на экран
func (sf *Screen) Set(cell types.ICell) {
	x, y := cell.Pos()
	style := cell.Style()
	lit := cell.Lit()
	sf.scr.SetCell(int(x), int(y), tcell.Style(style), rune(lit))
}
