
Entity = Class{}

function Entity:init(def)
    self.direction = 'down'
    self.previousDirection = ''
    self.walkingSpeed = def.walkingSpeed
    self.animations = self:createAnimations(def.animations)
    
    self.currentAnimation = self.animations['idle-down']

    self.stateMachine = StateMachine {
        ['walk'] = function() return EntityWalkState(self) end,
        ['edge'] = function() return EntityWalkEdgeState(self) end,
        ['idle'] = function() return EntityIdleState(self) end
    }
    self.stateMachine:change('idle')
    self.width = def.width
    self.height = def.height

end

function Entity:changeState(name)
    self.stateMachine:change(name)
    -- printChangeState to "..name)
end

function Entity:isMoveAllowed(point)
    return true
end

function Entity:changeAnimation(name)
    self.currentAnimation = self.animations[name]
end

function Entity:createAnimations(animations)
    local animationsReturned = {}

    for k, animationDef in pairs(animations) do
        animationsReturned[k] = Animation {
            texture = animationDef.texture or 'entities',
            frames = animationDef.frames,
            interval = animationDef.interval
        }
    end

    return animationsReturned
end

function Entity:processAI(params, dt)
    self.stateMachine:processAI(params, dt)
end

function Entity:update(dt)
    self.currentAnimation:update(dt)
    self.stateMachine:update(dt)
end

function Entity:render()
    self.stateMachine:render()
end