#ifndef _RIVE_SCENE_HPP_
#define _RIVE_SCENE_HPP_

#include "rive/animation/loop.hpp"
#include "rive/math/aabb.hpp"
#include "rive/math/vec2d.hpp"
#include <string>

namespace rive {
    class ArtboardInstance;
    class Renderer;

    class SMIInput;
    class SMIBool;
    class SMINumber;
    class SMITrigger;

    class Scene {
    protected:
        ArtboardInstance* m_ArtboardInstance;

        Scene(ArtboardInstance*);

    public:
        virtual ~Scene() {}

        Scene(Scene const& lhs) : m_ArtboardInstance(lhs.m_ArtboardInstance) {}

        float width() const;
        float height() const;
        AABB bounds() const { return {0, 0, this->width(), this->height()}; }

        virtual std::string name() const = 0;

        // Returns onShot if this has no looping (e.g. a statemachine)
        virtual Loop loop() const = 0;
        // Returns true iff the Scene is known to not be fully opaque
        virtual bool isTranslucent() const = 0;
        // returns -1 for continuous
        virtual float durationSeconds() const = 0;

        // returns true if draw() should be called
        virtual bool advanceAndApply(float elapsedSeconds) = 0;

        void draw(Renderer*);

        virtual void pointerDown(Vec2D);
        virtual void pointerMove(Vec2D);
        virtual void pointerUp(Vec2D);

        virtual size_t inputCount() const;
        virtual SMIInput* input(size_t index) const;
        virtual SMIBool* getBool(const std::string&) const;
        virtual SMINumber* getNumber(const std::string&) const;
        virtual SMITrigger* getTrigger(const std::string&) const;
    };

} // namespace rive

#endif
