#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
