function dumpWidgets(widget, level)
  widget = widget or rootWidget
  level = level or 0
  for i=1,widget:getChildCount() do
    local child = widget:getChildByIndex(i)
    if child:isVisible() then
      local name = child:getId()
      if name:match('widget%d+') == nil then
        print(string.rep(' ', level) .. name)
      end
      if child:getId() ~= 'terminalBuffer' then
        dumpWidgets(child, level+1)
      end
    end
  end
end

function drawDebugBoxes(enable)
  if enable == nil then enable = true end
  g_ui.setDebugBoxesDrawing(enable)
end

function hideMap()
  local map = rootWidget:recursiveGetChildById('gameMapPanel')
  if map then map:hide() end
end

function showMap()
  local map = rootWidget:recursiveGetChildById('gameMapPanel')
  if map then map:show() end
end

function debugContainersItems()
  function UIItem:onHoverChange(hovered)
    if hovered then
      local item = self:getItem()
      if item then
        local text = "id: " ..item:getId() .. 
                     "\n stackable: " ..tostring(item:isStackable()) ..
                     "\n marketable: " ..tostring(item:isMarketable()) ..
                     "\n vocation: "..(item:getMarketData() and item:getMarketData().restrictVocation or 'none') ..
                     "\n cloth slot: " ..item:getClothSlot()
        g_tooltip.display(text)
      end
    else
      g_tooltip.hide()
    end
  end
end

function debugPosition(enable)
  if enable == nil then enable = true end
  local label = rootWidget:getChildById('debugPositionLabel')
  if not label then
    label = g_ui.createWidget('GameLabel', rootWidget)
    label:setColor('pink')
    label:setFont('terminus-14px-bold')
    label:setId('debugPositionLabel')
    label:setPosition({x= 10, y = 40 })
    label:setPhantom(true)
    label:setTextAutoResize(true)
  end
  if enable then
    label.event = cycleEvent(function()
      local player = g_game.getLocalPlayer()
      if player then
        local pos = g_game.getLocalPlayer():getPosition()
        label:show()
        label:setText('x: ' .. pos.x .. '\ny: ' .. pos.y .. '\nz: ' .. pos.z)
      else
        label:hide()
      end
    end, 100)
  else
    removeEvent(label.event)
    label.event = nil
    label:hide()
  end
end

function autoReloadModule(name)
  local function reloadEvent()
    reloadModule(name)
    scheduleEvent(reloadEvent, 1000)
  end
  reloadEvent()
end

function createDebugUIItem(id)
  local uiitem = g_ui.createWidget('Item', rootWidget)
  uiitem:setPosition({x= 200, y = 200 })
  uiitem:setItemId(id)
  uiitem:show()
end
