// package line_cell -- строка ячеек
package line_cell

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"
)

// LineCell -- строка ячеек
type LineCell struct {
	app types.IKernel
	scr types.IScreen
	lst []types.ICell
}

// NewLineCell -- возвращает новую строку ячеек
func NewLineCell(app types.IKernel) (*LineCell, error) {
	if app == nil {
		return nil, fmt.Errorf("NewLineCell(): IApp==nil")
	}
	sf := &LineCell{
		app: app,
		scr: app.Screen(),
		lst: make([]types.ICell, 0),
	}
	return sf, nil
}

// Draw -- отрисовывает линию ячеек
func (sf *LineCell) Draw() {
	// for adr, _ := range sf.lst {
	// fmt.Printf("LineCell.Draw(): %v\n", adr)
	// sf.scr.SetCell(cell)
	cell := cell.NewCell()
	cell.SetLit(alias.Lit([]rune("=")[0]))
	st0 := tcell.StyleDefault
	st0 = st0.Background(tcell.ColorBlue).Foreground(tcell.ColorYellow)
	cell.SetStyle(alias.Style(st0))
	x0, y0 := sf.app.Cursor().Pos()
	scr := sf.app.Screen()
	for x := x0; x < x0+20; x++ {
		for y := y0; y < y0+5; y++ {
			cell.SetPos(x, y)
			scr.SetCell(cell)
		}
	}
	// }
}

// GetCell -- возвращает ячейку по смещению
func (sf *LineCell) GetCell(adr int) (types.ICell, error) {
	if adr >= len(sf.lst) {
		return nil, fmt.Errorf("LineCell.GetCell(): adr(%v)>=lenLine(%v)", adr, len(sf.lst))
	}
	return sf.lst[adr], nil
}

// AddCell -- добавляет ячейку в линию
func (sf *LineCell) AddCell(cell types.ICell) error {
	if cell == nil {
		return fmt.Errorf("LineCell.AddCell(): ICell==nil")
	}
	sf.lst = append(sf.lst, cell)
	return nil
}

// SetPos -- устанавливает новую позицию линии
func (sf *LineCell) SetPos(posX alias.PosX, posY alias.PosY) {
	for adr, cell := range sf.lst {
		cell.SetPos(posX+alias.PosX(adr), posY)
	}
}
