#include "rive/animation/blend_state_1d_instance.hpp"
#include "rive/animation/state_machine_input_instance.hpp"

using namespace rive;

BlendState1DInstance::BlendState1DInstance(const BlendState1D* blendState, ArtboardInstance* instance) :
    BlendStateInstance<BlendState1D, BlendAnimation1D>(blendState, instance) {}

int BlendState1DInstance::animationIndex(float value) {
    int idx = 0;
    int mid = 0;
    float closestValue = 0;
    int start = 0;
    int end = static_cast<int>(m_AnimationInstances.size()) - 1;

    while (start <= end) {
        mid = (start + end) >> 1;
        closestValue = m_AnimationInstances[mid].blendAnimation()->value();
        if (closestValue < value) {
            start = mid + 1;
        } else if (closestValue > value) {
            end = mid - 1;
        } else {
            idx = start = mid;
            break;
        }

        idx = start;
    }
    return idx;
}

void BlendState1DInstance::advance(float seconds, Span<SMIInput*> inputs) {
    BlendStateInstance<BlendState1D, BlendAnimation1D>::advance(seconds, inputs);

    auto blendState = state()->as<BlendState1D>();
    float value = 0.0f;
    if (blendState->hasValidInputId()) {
        // TODO: https://github.com/rive-app/rive-cpp/issues/229
        auto inputInstance = inputs[blendState->inputId()];
        auto numberInput = reinterpret_cast<const SMINumber*>(inputInstance);
        value = numberInput->value();
    }
    int index = animationIndex(value);
    auto animationsCount = static_cast<int>(m_AnimationInstances.size());
    m_To = index >= 0 && index < animationsCount ? &m_AnimationInstances[index] : nullptr;
    m_From =
        index - 1 >= 0 && index - 1 < animationsCount ? &m_AnimationInstances[index - 1] : nullptr;

    float mix, mixFrom;
    auto toValue = m_To == nullptr ? 0.0f : m_To->blendAnimation()->value();
    auto fromValue = m_From == nullptr ? 0.0f : m_From->blendAnimation()->value();

    if (m_To == nullptr || m_From == nullptr || toValue == fromValue) {
        mix = mixFrom = 1.0f;
    } else {
        mix = (value - fromValue) / (toValue - fromValue);
        mixFrom = 1.0f - mix;
    }

    for (auto& animation : m_AnimationInstances) {
        auto animationValue = animation.blendAnimation()->value();
        if (m_To != nullptr && animationValue == toValue) {
            animation.mix(mix);
        } else if (m_From != nullptr && animationValue == fromValue) {
            animation.mix(mixFrom);
        } else {
            animation.mix(0.0f);
        }
    }
}
