#include "rive/animation/keyframe_color.hpp"
#include "rive/generated/core_registry.hpp"
#include "rive/shapes/paint/color.hpp"

using namespace rive;

static void applyColor(Core* object, int propertyKey, float mix, int value) {
    if (mix == 1.0f) {
        CoreRegistry::setColor(object, propertyKey, value);
    } else {
        auto mixedColor = colorLerp(CoreRegistry::getColor(object, propertyKey), value, mix);
        CoreRegistry::setColor(object, propertyKey, mixedColor);
    }
}

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

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

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

    applyColor(object, propertyKey, mix, colorLerp(value(), nextColor.value(), f));
}