local ParentScreen = require "scenes.overworld.screens.parent"
local PauseScreen = ParentScreen:extend()

local ListBox = require "core.modules.menusystem.listbox"
local Widget  = require "core.modules.menusystem.widgets"

local Emblem = require "game.modules.gui.emblem"

local menu = require "game.modules.menus.fancy"
local baseMenu = require "game.modules.menus.parents.menu"
local baseWidget = require "game.modules.menus.parents.widget"

local CharacterMenu = baseMenu:extend()
local CharacterWidget = baseWidget:extend()

local TeamWidget = menu.BaseWidget:extend()
local ViewWidget = menu.BaseWidget:extend()
local SaveExitWidget = menu.BaseWidget:extend()

local const = require "scenes.overworld.screens.mainmenu.const"

function PauseScreen:new(scene, menu, widget)
  self.menuSelected = menu or "main"
  self.widgetSelected = widget
  self.widget = widget
  PauseScreen.super.new(self, scene, "Menu")
end

function PauseScreen:setMenu()
  menu.FancyMenu(self.scene, "main", const.X, const.Y, 108, 10, false)
  TeamWidget(self.scene)
  menu.BaseWidget(self.scene, "main", "Quest", ">")
  ViewWidget(self.scene, "Items", "items")
  menu.BaseWidget(self.scene, "main", "Chao", ">")
  menu.BaseWidget(self.scene, "main", "Encylopedia", ">")
  menu.BaseWidget(self.scene, "main", "Options", ">")
  self.scene.menusystem.menus["main"]:addSubMenu("save", "Save / Exit")
  SaveExitWidget(self.scene, "main", "Resume", false, false)

  SaveExitWidget(self.scene, "save", "Save game", true, false)
  SaveExitWidget(self.scene, "save", "Save and exit", true, true)
  SaveExitWidget(self.scene, "save", "Exit game", false, true)

  self.scene.menusystem.menus["main"]:finalize()

  CharacterMenu(self.scene)
  for i, name in ipairs(game.characters.team) do
    CharacterWidget(self.scene, name)
  end
  self.scene.menusystem.menus["character"].isLocked = true

  self.scene.menusystem:switchMenu(self.menuSelected)
  if (self.widgetSelected ~= nil) then
    self.scene.menusystem.menus[self.menuSelected].widget.selected = self.widgetSelected
  end
end

function PauseScreen:draw()

end

-- Character menu
function CharacterMenu:new(scene)
  local x = const.X + 136
  local w = const.WIDTH - x + 28
  CharacterMenu.super.new(self, scene, "character", x, const.Y, w, const.HEIGHT, 4)
end

function CharacterMenu:cancelAction()
  self.scene.menusystem:switchMenu("main")
end

-- Hero custom widget
--
function CharacterWidget:new(scene, name)
  self.charName = name
  self.emblem = Emblem(game.characters.list[name], scene)
  self.font2 = scene.assets.fonts["hudnbrs_small"]
  CharacterWidget.super.new(self, scene, "character")
end

function CharacterWidget:drawCanvas()
  local character = game.characters.list[self.charName]
  self.font:setFilter("shadow")
  local debut = 0
  local xDebut = 32
  self.font:draw(character.fullname, xDebut, debut, -1, "left")
  local yLvl = debut + 16
  local xLvl = xDebut
  self.scene.assets.images["lvl"]:draw(xLvl, yLvl)
  self.scene.assets.images["exp"]:draw(xLvl, yLvl + 10)
  self.font2:print(character.level, xLvl + 19, yLvl, "left")
  local expString = character.exp .. "/" .. character.exp_next
  self.font2:print(expString, xLvl + 19, yLvl + 10, "left")
  --text, x, y, limit, align
end

function CharacterWidget:draw(x, y)
  self.emblem:draw(x, y+6)
  if self.canvas.texture ~= nil then
    love.graphics.draw(self.canvas.texture, x - self.ox, y - self.oy)
  end
end

function CharacterWidget:action()
  self.scene.screens.mainmenu.character(self.scene, self.charName)
end

-- Team Widget
--

function TeamWidget:new(scene)
  TeamWidget.super.new(self, scene, "main", "Team", ">")
end

function TeamWidget:action()
  self.scene.menusystem.menus["character"]:getFocus()
end

-- View Widget
function ViewWidget:new(scene, name, view)
  TeamWidget.super.new(self, scene, "main", name, ">")
  self.nextView = view
end

function ViewWidget:action()
  self.scene.screens.mainmenu[self.nextView](self.scene)
end

-- Save & Exit Widget
function SaveExitWidget:new(scene, menu, name, save, exit)
  SaveExitWidget.super.new(self, scene, menu, name, "")
  self.exit = exit
  self.save = save
end

function SaveExitWidget:action()
  if (self.save) then
    game:write()
  end
  if (self.exit) then
    scenes.debug.menu()
  else
    self.scene:unpause()
  end
end

return PauseScreen
