#ifndef _RIVE_KEYED_PROPERTY_HPP_
#define _RIVE_KEYED_PROPERTY_HPP_
#include "rive/generated/animation/keyed_property_base.hpp"
#include <vector>
namespace rive
{
class KeyFrame;
class KeyedCallbackReporter;
class LinearAnimationInstance;
class KeyedProperty : public KeyedPropertyBase
{
public:
    KeyedProperty();
    ~KeyedProperty() override;
    void addKeyFrame(std::unique_ptr<KeyFrame>);
    StatusCode onAddedClean(CoreContext* context) override;
    StatusCode onAddedDirty(CoreContext* context) override;

    /// Report any keyframes that occured between secondsFrom and secondsTo.
    void reportKeyedCallbacks(KeyedCallbackReporter* reporter,
                              uint32_t objectId,
                              float secondsFrom,
                              float secondsTo,
                              bool isAtStartFrame) const;

    /// Apply interpolating key frames. `context` is the running
    /// LinearAnimationInstance, propagated so scripted interpolators can vend
    /// per-(LAI, keyframe) stateful clones. Default-null keeps direct callers
    /// (tests, hold animations) source-compatible.
    void apply(Core* object,
               float time,
               float mix,
               const LinearAnimationInstance* context = nullptr);

    StatusCode import(ImportStack& importStack) override;
    KeyFrame* first() const
    {
        if (m_keyFrames.size() > 0)
        {
            return m_keyFrames.front().get();
        }
        return nullptr;
    }

private:
    int closestFrameIndex(float seconds, int exactOffset = 0) const;
    std::vector<std::unique_ptr<KeyFrame>> m_keyFrames;
};
} // namespace rive

#endif