#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
