#include "rive/animation/keyframe_double.hpp"
#include "rive/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);
}