#ifndef _RIVE_STATE_MACHINE_INSTANCE_HPP_
#define _RIVE_STATE_MACHINE_INSTANCE_HPP_

#include <string>
#include <stddef.h>
#include "rive/animation/linear_animation_instance.hpp"

namespace rive {
    class StateMachine;
    class LayerState;
    class SMIInput;
    class Artboard;
    class SMIBool;
    class SMINumber;
    class SMITrigger;

    class StateMachineLayerInstance;

    class StateMachineInstance {
        friend class SMIInput;

    private:
        const StateMachine* m_Machine;
        bool m_NeedsAdvance = false;

        size_t m_InputCount;
        SMIInput** m_InputInstances;
        size_t m_LayerCount;
        StateMachineLayerInstance* m_Layers;

        void markNeedsAdvance();

    public:
        StateMachineInstance(const StateMachine* machine);
        ~StateMachineInstance();

        // Advance the state machine by the specified time. Returns true if the
        // state machine will continue to animate after this advance.
        bool advance(Artboard* artboard, float seconds);

        // Returns true when the StateMachineInstance has more data to process.
        bool needsAdvance() const;

        // Returns a pointer to the instance's stateMachine
        const StateMachine* stateMachine() const { return m_Machine; }

        size_t inputCount() const { return m_InputCount; }
        SMIInput* input(size_t index) const;

        SMIBool* getBool(std::string name) const;
        SMINumber* getNumber(std::string name) const;
        SMITrigger* getTrigger(std::string name) const;

        const size_t currentAnimationCount() const;
        const LinearAnimationInstance*
        currentAnimationByIndex(size_t index) const;

        // The number of state changes that occurred across all layers on the
        // previous advance.
        size_t stateChangedCount() const;

        // Returns the state name for states that changed in layers on the
        // previously called advance. If the index of out of range, it returns
        // the empty string.
        const LayerState* stateChangedByIndex(size_t index) const;
    };
} // namespace rive
#endif
