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

using namespace rive;

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

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, SMIInput** inputs)
{
	BlendStateInstance<BlendState1D, BlendAnimation1D>::advance(seconds,
	                                                            inputs);

	auto inputInstance = inputs[state()->as<BlendState1D>()->inputId()];

	auto numberInput = reinterpret_cast<const SMINumber*>(inputInstance);
	auto 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);
		}
	}
}
