local NodeManager = class('NodeManager', {
  state = 'running',
  stateTime = 0,
  currentNode = nil,
})

function NodeManager:init(config)
  self.config = config
  self.nodes = {}
  self.nodeConfs = {}

  self.currentNode = nil

  print('Initializing NodeManager')
end

function NodeManager:load()
  self:configChanged()
end

function NodeManager:resize(w, h)
  self.secondaryCanvas = love.graphics.newCanvas(w, h)
end

function NodeManager:configChanged()
  local cnt = {}
  local newNodes = {}
  local newNodeConfs = {}

  for _, c_ in ipairs(self.config.nodes) do
    local nodeConfig = lume.clone(c_)
    local hash = inspect(nodeConfig)
    if cnt[hash] == nil then cnt[hash] = 0 end
    cnt[hash] = cnt[hash] + 1
    hash = hash .. '-' .. tostring(cnt[hash])

    local nodeName = nodeConfig[1]
    table.remove(nodeConfig, 1)

    if self.nodeConfs[hash] then
      print('Using existing node:', self.nodeConfs[hash], hash)
      newNodes[#newNodes + 1] = self.nodeConfs[hash]
    else
      print('Creating new node.', nodeName, inspect(nodeConfig))
      local status, err = pcall(function()
        newNodes[#newNodes + 1] = require(nodeName)(nodeConfig)
      end)
      if err then
        print("Error occured while loading", nodeName, err)
        return
      end
    end

    newNodeConfs[hash] = newNodes[#newNodes]
  end

  self.nodes = newNodes
  self.nodeConfs = newNodeConfs
end

function NodeManager:render()
  if not self.currentNode then self.currentNode = self.nodes[1] end
  if not self.currentNode then return end

  -- love.graphics.print('state: ' .. self.state .. '; counter: ' .. tostring(self.stateTime), 50, 50)

  self.currentNode:render()

  if self.state == 'transitioning' and self.currentNode ~= self.nextNode and self.nextNode then
    self.secondaryCanvas:renderTo(function()
      self.nextNode:render()
    end)
    love.graphics.setColor(1.0, 1.0, 1.0, 1.0 * (self.stateTime / self.config.transitionTime))
    love.graphics.draw(self.secondaryCanvas, 0, 0)
  end

  love.graphics.setColor(1.0, 1.0, 1.0, 0.3)

  if self.config.showProgress and self.state == 'running' then
    local stateTime
    stateTime = self.currentNode.displayTime or self.config.displayTime
    local h = 5
    love.graphics.rectangle("fill", 0, love.graphics.getHeight() - h, (self.stateTime / stateTime) * love.graphics.getWidth(), h)
  end
end

function NodeManager:update(dt)
  if not self.currentNode then self.currentNode = self.nodes[1] end
  if not self.currentNode then return end

  self.stateTime = self.stateTime + dt

  if self.state == 'transitioning' and self.stateTime >= self.config.transitionTime then
    self.stateTime = 0
    self.state = 'running'
    self.currentNode:afterExit()
    -- self.currentNode, self.nextNode = self.nextNode, self.nodes[(lume.find(self.nodes, self.nextNode) or 1) % #self.nodes + 1]
    self.currentNode = self.nextNode
    self.currentNode:afterEnter()
  elseif self.state == 'running' and self.stateTime >= (self.currentNode.displayTime or self.config.displayTime) then
    self.stateTime = 0
    self.state = 'transitioning'
    self.currentNode:beforeExit()
    self.nextNode = self.nodes[(lume.find(self.nodes, self.currentNode) or 1) % #self.nodes + 1]
    self.nextNode:beforeEnter()
  end

  self.currentNode:update(dt)
  if self.state == 'transitioning' and self.currentNode ~= self.nextNode and self.nextNode then
    self.nextNode:update(dt)
  end
end

return NodeManager
