---@class Text
---@field lines string[]
---@field hl Highlight[]
---@field lineNr number
---@field current string
local Text = {}
Text.__index = Text

function Text:new()
  local this = { lines = {}, hl = {}, lineNr = 0, current = "" }
  setmetatable(this, self)
  return this
end

function Text:nl()
  table.insert(self.lines, self.current)
  self.current = ""
  self.lineNr = self.lineNr + 1
end

function Text:render(str, group, opts)
  str = str:gsub("[\n]", " ")
  if type(opts) == "string" then
    opts = { append = opts }
  end
  opts = opts or {}

  if group then
    if opts.exact ~= true then
      group = "Trouble" .. group
    end
    local from = string.len(self.current)
    ---@class Highlight
    local hl
    hl = {
      line = self.lineNr,
      from = from,
      to = from + string.len(str),
      group = group,
    }
    table.insert(self.hl, hl)
  end
  self.current = self.current .. str
  if opts.append then
    self.current = self.current .. opts.append
  end
  if opts.nl then
    self:nl()
  end
end

return Text