package termutil

import "strings"

type Line struct {
	wrapped bool // whether line was wrapped onto from the previous one
	cells   []Cell
}

func newLine() Line {
	return Line{
		wrapped: false,
		cells:   []Cell{},
	}
}

func (line *Line) Len() uint16 {
	return uint16(len(line.cells))
}

func (line *Line) String() string {
	runes := []rune{}
	for _, cell := range line.cells {
		runes = append(runes, cell.r.Rune)
	}
	return strings.TrimRight(string(runes), "\x00")
}

func (line *Line) append(cells ...Cell) {
	line.cells = append(line.cells, cells...)
}

func (line *Line) shrink(width uint16) {
	if line.Len() <= width {
		return
	}
	remove := line.Len() - width
	var cells []Cell
	for _, cell := range line.cells {
		if cell.r.Rune == 0 && remove > 0 {
			remove--
		} else {
			cells = append(cells, cell)
		}
	}
	line.cells = cells
}

func (line *Line) wrap(width uint16) []Line {

	var output []Line
	var current Line

	current.wrapped = line.wrapped

	for _, cell := range line.cells {
		if len(current.cells) == int(width) {
			output = append(output, current)
			current = newLine()
			current.wrapped = true
		}
		current.cells = append(current.cells, cell)
	}

	return append(output, current)
}