local Scene = require "core.modules.scenes"
local menu = require "scenes.debug.viewers.choregraphy.menu"

local ChoregraphyViewer = Scene:extend()

local World = require "scenes.battlesystem.world"
local Fighter = require "scenes.debug.viewers.choregraphy.mocks.fighter"

local ennutils = require "game.utils.ennemies"

function ChoregraphyViewer:new()
  ChoregraphyViewer.super.new(self)
  self.assets:batchImport("scenes.battlesystem.assets")
  self.world = World(self)

  self:buildMenu()
  self:buildMocks()
end

-- MENU FUNCTIONS
function ChoregraphyViewer:buildMenu()
  menu.commons.DebugMenu(self, "MainMenu")

  self:buildCharacterMenu()

  self.menusystem.menus["MainMenu"]:finalize()
  self.menusystem:activate()
  self.menusystem:switchMenu("MainMenu")
  menu.commons.SceneWidget(self, "MainMenu", scenes.debug.menu, "Back")
end

function ChoregraphyViewer:buildCharacterMenu()
  for i,category in ipairs(ennutils.listCategories()) do
    self:buildEnnemyListMenu(category)
  end

  self:addSubMenu("characters", "MainMenu", "Rivals")
  for k, character in pairs(game.characters.list) do
    self:addSubMenu(k, "characters", character.fullname)
    menu.HeroChoregraphyWidget(self, k, game.skills:getSkillData("attack"))
    self:buildSkillMenu(k)
  end
end

function ChoregraphyViewer:buildEnnemyListMenu(category)
  self:addSubMenu(category, "MainMenu", category)
  for i,ennemy in ipairs(ennutils.getEnnemiesFromCategory(category)) do
    self:buildEnnemySkillMenu(category, ennemy)
  end
end

function ChoregraphyViewer:buildEnnemySkillMenu(category, ennemy)
  self:addSubMenu(ennemy, category, ennemy)
  local data = ennutils.getData(category, ennemy)
  for j,skillName in ipairs(data.skills) do
    if (game.skills:ennemySkillDataExists(skillName)) then
      menu.EnnemyChoregraphyWidget(self, category, ennemy, game.skills:getEnnemySkillData(skillName))
    end
  end
end

function ChoregraphyViewer:buildSkillMenu(charName)
  local skillList = require("datas.gamedata.characters." .. charName .. ".skills")
  local skillTreated = {}
  for i,skill  in ipairs(skillList) do
    local skillName = skill[1]
    if (skillTreated[skillName] ~= true) then
      skillTreated[skillName] = true
      if (game.skills:skillDataExists(skillName)) then
        menu.HeroChoregraphyWidget(self, charName, game.skills:getSkillData(skillName))
      end
    end
  end
end

function ChoregraphyViewer:addSubMenu(submenu, parent, name)
  local parent = parent or "MainMenu"
  self.menusystem.menus[parent]:addSubMenu(submenu, name)
end

-- MOCKS FUNCTIONS
function ChoregraphyViewer:buildMocks()
  self.fighter = Fighter(self)
end

function ChoregraphyViewer:playHeroChoregraphy(character, data)
  self.fighter:playHeroChoregraphy(character, data)
end

function ChoregraphyViewer:playEnnemyChoregraphy(category, ennemy, data)
  self.fighter:playEnnemyChoregraphy(category, ennemy, data)
end

-- OTHER
function ChoregraphyViewer:update(dt)
  self.fighter:update(dt)
  self.world:update(dt)
end

function ChoregraphyViewer:draw()

end

return ChoregraphyViewer
