local ChoregraphySystem = Object:extend()

local choregraphyUtils = require "game.utils.choregraphy"
local stepObjectList = require "scenes.battlesystem.controllers.fighters.systems.choregraphy.step"
local qteObjectList = require "scenes.battlesystem.controllers.fighters.systems.choregraphy.qte"

function ChoregraphySystem:new(action, choregraphy)
  self.action = action
  self.fighter = action.fighter
  self.actor = self.fighter.actor
  self.assets = self.fighter.actor.assets
  self.world = self.actor.world
  self.target = action.target

  self.currentStepId = 0
  self.currentStep = nil
  self.stepList = choregraphy

  self.qte = {}
  self.qte.current = nil
  self.qte.wasSuccess = false
end

function ChoregraphySystem:update(dt)
  if (self.qte.current ~= nil) then
    self.qte.current:update(dt)
  end

  if (self.currentStep ~= nil) then
    self.currentStep:updateStep(dt)
  else
    self:switchStep()
  end
end

function ChoregraphySystem:switchStep()
  if self:haveNextStep() then
    self.currentStepId = self.currentStepId + 1
    local stepData = choregraphyUtils.getStepDatas(self.stepList[self.currentStepId])
    core.debug:print("cbs/choregraphy", "Starting step " .. stepData.name)
    if (stepObjectList[stepData.name] ~= nil) then
      self.currentStep = stepObjectList[stepData.name](self, stepData.arguments)
    end
  else
    self:endChoregraphy()
  end
end

function ChoregraphySystem:addQTE(action, origin, qteBaseData, blockProcess)
  local qteData = choregraphyUtils.getQteDatas(qteBaseData)
  if (qteObjectList[qteData.name] ~= nil) then
    self.qte.current = qteObjectList[qteData.name](self, qteData.arguments)
    self.qte.current:blockAction(action, blockProcess)
    self.qte.current:setOrigin(origin)
  end
end

function ChoregraphySystem:sendDamage(power, accuracy, isSpecial, isAerial)
  if (self.target ~= nil) then
    if (self.fighter.isAlive) then
      self.fighter:sendDamage(self.target, power, accuracy, isSpecial, isAerial)
      return true
    else
      return false
    end
  end
end

function ChoregraphySystem:useItemEffect()
  self.action:useItemEffect()
end

function ChoregraphySystem:endStep()
  self.currentStep = nil
end

function ChoregraphySystem:endChoregraphy()
  self.actor:choregraphyEnded()
  self.action:choregraphyEnded()
  self.fighter.turnSystem:applyDeath()
end

function ChoregraphySystem:haveNextStep()
  return ((self.currentStepId + 1) <= #self.stepList)
end

return ChoregraphySystem
