local FighterParent = require "scenes.battlesystem.controllers.fighters.parent"
local HeroFighter = FighterParent:extend()

local StatusBar   = require "game.modules.gui.statusbar"
local SelectionSystem = require "scenes.battlesystem.controllers.fighters.systems.selection"
local actionList = require "scenes.battlesystem.controllers.fighters.systems.actions"

local POSITIONS = {3, 1, 5}
local HEROES_LINE = 2;

local HUDBASE = 8
local HUDSIZE = 91

function HeroFighter:new(owner, character, id)
  self.name = character
  self.super.new(self, owner, true, id)

  self.statusbar = StatusBar(self.abstract, self.turnSystem.scene)
  self:initVoices()

  self.selection = nil
  self.exp = self.abstract.exp
end

function HeroFighter:updateAssets(dt)
  self.statusbar:update(dt)
end

function HeroFighter:update(dt)
  HeroFighter.super.update(self, dt)
  if (self.selection ~= nil) then
    self.selection:update(dt)
  end
end

function HeroFighter:getAbstract()
  return game.characters.list[self.name]
end

function HeroFighter:createActor()
  local x, y = HEROES_LINE, ((self.id-1)*(4/(#game.characters.team-1))+1)
  local hero = self.world.obj.Hero(self.world, x, y, self)
  if (self.abstract.hp <= 0) then
    hero:setAsKo()
  end
  return hero
end

function HeroFighter:startAction()
  core.debug:print("cbs/heroFighter", "launching the action menu")
  self.action = nil
  self:talk("turnstart")
  self.turnSystem.scene.menu:set( self )
end

function HeroFighter:endAction()

end

-- Basic actions
function HeroFighter:doNothing()
  self:setInactive()
end

function HeroFighter:doBasicAction(action)
  self.action = actionList[action](self)
  self:verifyTargets()
end

function HeroFighter:useItem(category, item)
  self.action = actionList["item"](self, category, item)
  self:verifyTargets()
end

function HeroFighter:useSkill(skill)
  self.action = actionList["skill"](self, skill)
  self:verifyTargets()
end

function HeroFighter:verifyTargets()
  local needTarget, targetEnnemies = self.action:needTarget()

  if (needTarget) then
    if (targetEnnemies) then
      self.selection = SelectionSystem(self, self.owner.turnSystem.ennemies, true)
    else
      self.selection = SelectionSystem(self, self.owner, false)
    end
  else
    self.action:start()
  end

end

function HeroFighter:attack()
  self:doBasicAction("attack")
end

function HeroFighter:receiveTarget(target)
  self.selection = nil
  if (self.action ~= nil) then
    self.action:setTarget(target)
    self.action:start()
  end
end

function HeroFighter:goBackToMenu()
  self.owner.turnSystem.scene.menusystem:activate()
  self.selection = nil
end

-- LIFE functions
function HeroFighter:updatePP()
  self.statusbar:updatePP()
end

function HeroFighter:updateHP()
  self.statusbar:updateHP()
end

-- VOICE SYSTEM

function HeroFighter:initVoices()
  self:addVoiceEffect("move")
  self:addVoiceEffect("turnstart")
end

function HeroFighter:addVoiceEffect(name)
  local completename = self.name .. "_" .. name
  local path = "datas/gamedata/characters/" .. self.name .. "/voices/" .. name .. ".wav"
  self.assets:newSFX(completename, path)
end

function HeroFighter:talk(name)
  local completename = self.name .. "_" .. name
  self.assets.sfx[completename]:play()
end

-- DRAW FUNCTIONS
function HeroFighter:drawIcon(x, y)
  local iconID = self.abstract.data.icon
  self.assets.tileset["charicons"]:drawTile(iconID, x, y)
end

function HeroFighter:drawHUD()
  local boxSize = 424 / 4
  local x = (self.id-0.5)*boxSize
  local y = self.turnSystem.hud:getPlayerHUDPosition()
  self.statusbar:draw(x - HUDSIZE/2, y)
end

return HeroFighter
