#ifndef _RIVE_STATE_MACHINE_HPP_
#define _RIVE_STATE_MACHINE_HPP_
#include "rive/generated/animation/state_machine_base.hpp"
#include <stdio.h>
#include <vector>

namespace rive
{
    class StateMachineLayer;
    class StateMachineInput;
    class StateMachineImporter;
    class StateMachine : public StateMachineBase
    {
        friend class StateMachineImporter;

    private:
        std::vector<StateMachineLayer*> m_Layers;
        std::vector<StateMachineInput*> m_Inputs;

        void addLayer(StateMachineLayer* layer);
        void addInput(StateMachineInput* input);

    public:
        ~StateMachine();
        StatusCode import(ImportStack& importStack) override;

        size_t layerCount() const { return m_Layers.size(); }
        size_t inputCount() const { return m_Inputs.size(); }

        const StateMachineInput* input(std::string name) const;
        const StateMachineInput* input(size_t index) const;
        const StateMachineLayer* layer(std::string name) const;
        const StateMachineLayer* layer(size_t index) const;

        StatusCode onAddedDirty(CoreContext* context) override;
        StatusCode onAddedClean(CoreContext* context) override;
    };
} // namespace rive

#endif