#include "rive/animation/animation_state_instance.hpp"
#include "rive/animation/animation_state.hpp"

using namespace rive;

static LinearAnimation emptyAnimation;

AnimationStateInstance::AnimationStateInstance(const AnimationState* state,
                                               ArtboardInstance* instance) :
    StateInstance(state),
    // We're careful to always instance a valid animation here as the
    // StateMachine makes assumptions about AnimationState's producing valid
    // AnimationStateInstances with backing animations. This was discovered when
    // using Clang address sanitizer. We previously returned a
    // SystemStateInstance (basically a no-op StateMachine state) which would
    // cause bad casts in parts of the code where we assumed AnimationStates
    // would have create AnimationStateInstances.
    m_AnimationInstance(state->animation() ? state->animation() : &emptyAnimation,
                        instance,
                        state->speed()),
    m_KeepGoing(true)
{}

// NOTE:: should we return bool here? we are not currently using the output of this, we are instead
// using m_keepGoing directly.
void AnimationStateInstance::advance(float seconds, Span<SMIInput*>)
{
    m_KeepGoing = m_AnimationInstance.advance(seconds * state()->as<AnimationState>()->speed());
}

void AnimationStateInstance::apply(float mix) { m_AnimationInstance.apply(mix); }

bool AnimationStateInstance::keepGoing() const { return m_KeepGoing; }
void AnimationStateInstance::clearSpilledTime() { m_AnimationInstance.clearSpilledTime(); }