local Menu = Object:extend()

function Menu:new(menusystem, name, x, y, w, h)
  self.menusystem = menusystem
  self.name       = name

  self.x = x
  self.y = y
  self.w = w
  self.h = h

  self.widget = {}
  self.widget.list              = {}
  self.widget.selected          = 0
  self.widget.selectedPrevious  = 0
  self.widget.cancel            = 0
  self:updateWidgetSize()

  self.isDestroyed  = false
  self.haveFocus    = false
  self.isVisible    = true
  self.isActive     = true

  self.sound = {}
  self.sound.asset = nil
  self.sound.active = false

  self:register()
end

function Menu:register()
  self.menusystem:addMenu(self.name, self)
end

function Menu:setCancelWidget(id)
  self.widget.cancel = #self.widget.list
end

function Menu:updateWidgetSize()
  self.widget.h = 0
  self.widget.w = 0
end

function Menu:getWidgetSize(id)
  return self.widget.h, self.widget.w
end

function Menu:cancelAction()
  if (self.widget.cancel ~= 0) then
    self.widget.list[self.widget.cancel]:action()
  end
end

function Menu:update(dt)
  -- Cette fonction ne contient rien par défaut
end

function Menu:clear()
  self.widget.list = {}
  self.widget.cancel = 0
end

function Menu:resize(x,y,w,h)
  self.x = x
  self.y = y
  self.w = w
  self.h = h

  self:updateWidgetSize()
end

function Menu:destroy()
  self.destroyed = true
end

function Menu:draw()
  -- nothing here
end

function Menu:drawCanvas()

end

function Menu:keyreleased(key)
  -- Cette fonction ne contient rien par défaut
end

function Menu:mousemoved(x, y)
  -- Cette fonction ne contient rien par défaut
end

function Menu:mousepressed( x, y, button, istouch )
  -- Cette fonction ne contient rien par défaut
end

function Menu:addWidget(newwidget)
  if #self.widget.list == 0 then
    self.widget.selected = 1
  end
  table.insert(self.widget.list, newwidget)
end

function Menu:updateWidgets(dt)
  self:removeDestroyedWidgets()
  for i,v in ipairs(self.widget.list) do
    v.id = i
    v:update(dt)
  end
end

function Menu:removeDestroyedWidgets() -- On retire les widgets marquées comme supprimées
  for i,v in ipairs(self.widget.list) do
    if (v.destroyed == true) then
      table.remove(self.widget.list, i)
    end
  end
end

function Menu:setCursor(cursorid)
  self.widget.selected = cursorid --math.max(1, math.min(cursorid, #self.widget.list))
end

function Menu:moveCursor(new_selected)
  self:playSelectSound()
  if new_selected < 1 then
    self.widget.selected = #self.widget.list + new_selected
  else
    if new_selected > #self.widget.list then
      self.widget.selected = new_selected - #self.widget.list
    else
      self.widget.selected = new_selected
    end
  end
end

function Menu:setSound(soundasset)
  self.sound.active = true
  self.sound.asset = soundasset
end

function Menu:playSelectSound()
  if self.sound.active == true then
    self.sound.asset:setVolume(game.options.data.audio.sfx / 100)
    love.audio.play( self.sound.asset )
  end
end

function Menu:resetView()
  -- ne sert à rien ici, c'est juste pour éviter des crash
end

function Menu:moveView()
  -- ne sert à rien ici, c'est juste pour éviter des crash
end

return Menu
