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

namespace rive
{
    class StateTransition;
    class LayerStateImporter;
    class StateMachineLayerImporter;
    class StateInstance;

    class LayerState : public LayerStateBase
    {
        friend class LayerStateImporter;
        friend class StateMachineLayerImporter;

    private:
        std::vector<StateTransition*> m_Transitions;
        void addTransition(StateTransition* transition);

    public:
        ~LayerState();
        StatusCode onAddedDirty(CoreContext* context) override;
        StatusCode onAddedClean(CoreContext* context) override;

        StatusCode import(ImportStack& importStack) override;

        size_t transitionCount() const { return m_Transitions.size(); }
        StateTransition* transition(size_t index) const
        {
            if (index < m_Transitions.size())
            {
                return m_Transitions[index];
            }
            return nullptr;
        }

        /// Make an instance of this state that can be advanced and applied by
        /// the state machine when it is active or being transitioned from.
        virtual StateInstance* makeInstance() const;
    };
} // namespace rive

#endif