#ifndef _RIVE_LINEAR_ANIMATION_HPP_
#define _RIVE_LINEAR_ANIMATION_HPP_
#include "rive/animation/loop.hpp"
#include "rive/generated/animation/linear_animation_base.hpp"
#include <vector>
namespace rive {
class Artboard;
class KeyedObject;

class LinearAnimation : public LinearAnimationBase {
private:
    std::vector<std::unique_ptr<KeyedObject>> m_KeyedObjects;

    friend class Artboard;

public:
    LinearAnimation();
    ~LinearAnimation() override;
    StatusCode onAddedDirty(CoreContext* context) override;
    StatusCode onAddedClean(CoreContext* context) override;
    void addKeyedObject(std::unique_ptr<KeyedObject>);
    void apply(Artboard* artboard, float time, float mix = 1.0f) const;

    Loop loop() const { return (Loop)loopValue(); }

    StatusCode import(ImportStack& importStack) override;

    float startSeconds() const;
    float endSeconds() const;
    float durationSeconds() const;

    /// Convert a global clock to local seconds (takes into consideration
    /// work area start/end, speed, looping).
    float globalToLocalSeconds(float seconds) const;

#ifdef TESTING
    size_t numKeyedObjects() { return m_KeyedObjects.size(); }
    // Used in testing to check how many animations gets deleted.
    static int deleteCount;
#endif
};
} // namespace rive

#endif
