#include "animation/keyframe_double.hpp"
#include "generated/core_registry.hpp"

using namespace rive;

// This whole class is intentionally misnamed to match our editor code. The
// editor uses doubles (float64) for numeric values but at runtime 32 bit
// floating point numbers suffice. So even though this is a "double keyframe" to
// match editor names, the actual values are stored and applied in 32 bits.

static void applyDouble(Core* object, int propertyKey, float mix, float value)
{
	if (mix == 1.0f)
	{
		CoreRegistry::setDouble(object, propertyKey, value);
	}
	else
	{
		float mixi = 1.0 - mix;
		CoreRegistry::setDouble(
		    object,
		    propertyKey,
		    CoreRegistry::getDouble(object, propertyKey) * mixi + value * mix);
	}
}

void KeyFrameDouble::apply(Core* object, int propertyKey, float mix)
{
	applyDouble(object, propertyKey, mix, value());
}

void KeyFrameDouble::applyInterpolation(Core* object,
                                        int propertyKey,
                                        float currentTime,
                                        const KeyFrame* nextFrame,
                                        float mix)
{
	auto kfd = nextFrame->as<KeyFrameDouble>();
	const KeyFrameDouble& nextDouble = *kfd;
	float f = (currentTime - seconds()) / (nextDouble.seconds() - seconds());

	if (CubicInterpolator* cubic = interpolator())
	{
		f = cubic->transform(f);
	}

	applyDouble(
	    object, propertyKey, mix, value() + (nextDouble.value() - value()) * f);
}