#ifndef _RIVE_KEY_FRAME_HPP_
#define _RIVE_KEY_FRAME_HPP_
#include "rive/generated/animation/keyframe_base.hpp"
namespace rive {
    class CubicInterpolator;

    class KeyFrame : public KeyFrameBase {
    private:
        CubicInterpolator* m_Interpolator = nullptr;
        float m_Seconds;

    public:
        inline float seconds() const { return m_Seconds; }
        inline CubicInterpolator* interpolator() const {
            return m_Interpolator;
        }

        void computeSeconds(int fps);

        StatusCode onAddedDirty(CoreContext* context) override;
        virtual void apply(Core* object, int propertyKey, float mix) = 0;
        virtual void applyInterpolation(Core* object,
                                        int propertyKey,
                                        float seconds,
                                        const KeyFrame* nextFrame,
                                        float mix) = 0;

        StatusCode import(ImportStack& importStack) override;
    };
} // namespace rive

#endif