// package widget -- базовый виджет для построения других виджетов
package widget

import (
	"fmt"

	"github.com/gdamore/tcell"

	"p78git.ddns.net/svi/libtui/alias"
	"p78git.ddns.net/svi/libtui/cell"
	"p78git.ddns.net/svi/libtui/color"
	"p78git.ddns.net/svi/libtui/pos"
	"p78git.ddns.net/svi/libtui/safe_bool"
	"p78git.ddns.net/svi/libtui/size"
	"p78git.ddns.net/svi/libtui/types"
)

// Widget -- базовый виджет для построения других виджетов
type Widget struct {
	app       types.IApp
	screen    types.IScreen
	pos       types.IPos
	size      types.ISize
	lstCell   []types.ICell
	bgColor   types.IColor
	fgColor   types.IColor
	isVisible types.ISafeBool
	style     alias.Style
	lit       rune
}

// NewWidget -- возвращает новый виджет
func NewWidget(screen types.IScreen) (*Widget, error) {
	if screen == nil {
		return nil, fmt.Errorf("NewWidget(): IScreen==nil")
	}
	sf := &Widget{
		app:       screen.App(),
		screen:    screen,
		pos:       pos.NewPos(),
		size:      size.NewSize(),
		lstCell:   make([]types.ICell, 0),
		bgColor:   color.NewColor(),
		fgColor:   color.NewColor(),
		isVisible: safe_bool.NewSafeBool(),
		style:     0,
		lit:       []rune(" ")[0],
	}
	color := tcell.Color(sf.bgColor.Get())
	sf.style = alias.Style(tcell.StyleDefault.Background(color))
	return sf, nil
}

// Draw -- отрисовывает виджет потребованию
func (sf *Widget) Draw() {
	if !sf.isVisible.Get() {
		return
	}
	for _, cell := range sf.lstCell {
		sf.screen.Set(cell)
	}
}

// FgColor -- возвращает цвет переднего фона
func (sf *Widget) FgColor() types.IColor {
	return sf.fgColor
}

// BgColor -- возвращает цвет фона
func (sf *Widget) BgColor() types.IColor {
	return sf.bgColor
}

// Size -- возвращает объект размера виджета
func (sf *Widget) Size() (alias.SizeX, alias.SizeY) {
	return sf.size.Get()
}

// Resize -- изменяет размер виджета
func (sf *Widget) Resize(sizeX alias.SizeX, sizeY alias.SizeY) {
	x_, y_ := sf.size.Get()
	if x_ == sizeX && y_ == sizeY {
		return
	}
	sf.size.Set(sizeX, sizeY)
	for len(sf.lstCell) < int(sizeX)*int(sizeY) {
		cell := cell.NewCell()
		cell.SetStyle(sf.style)
		sf.lstCell = append(sf.lstCell, cell)
	}
}

// Pos -- возвращает размера виджета
func (sf *Widget) Pos() (alias.PosX, alias.PosY) {
	return sf.pos.Get()
}
