#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));
}