---@class Runner
---@field _tasks LazyTask[]
local Runner = {}

function Runner.new()
  local self = setmetatable({}, {
    __index = Runner,
  })
  self._tasks = {}

  return self
end

---@param task LazyTask
function Runner:add(task)
  table.insert(self._tasks, task)
  task:start()
end

function Runner:is_empty()
  return #self._tasks == 0
end

---@return LazyPlugin[]
function Runner:plugins()
  ---@param task LazyTask
  return vim.tbl_map(function(task)
    return task.plugin
  end, self._tasks)
end

function Runner:tasks()
  return self._tasks
end

---@param cb? fun()
function Runner:wait(cb)
  if #self._tasks == 0 then
    return cb and cb()
  end

  local done = false
  local check = vim.loop.new_check()

  check:start(function()
    for _, task in ipairs(self._tasks) do
      if task.running then
        return
      end
    end

    check:stop()

    done = true

    if cb then
      vim.schedule(cb)
    end
  end)

  if not cb then
    while not done do
      vim.wait(100)
    end
  end
end

return Runner