#ifndef _RIVE_STATE_MACHINE_LISTENER_HPP_
#define _RIVE_STATE_MACHINE_LISTENER_HPP_
#include "rive/generated/animation/state_machine_listener_base.hpp"
#include "rive/listener_type.hpp"
#include "rive/math/vec2d.hpp"

namespace rive {
    class Shape;
    class StateMachineListenerImporter;
    class ListenerAction;
    class StateMachineInstance;
    class StateMachineListener : public StateMachineListenerBase {
        friend class StateMachineListenerImporter;

    private:
        std::vector<uint32_t> m_HitShapesIds;
        std::vector<ListenerAction*> m_Actions;
        void addAction(ListenerAction* action);

    public:
        ListenerType listenerType() const { return (ListenerType)listenerTypeValue(); }
        size_t actionCount() const { return m_Actions.size(); }

        const ListenerAction* action(size_t index) const;
        StatusCode import(ImportStack& importStack) override;
        StatusCode onAddedClean(CoreContext* context) override;

        const std::vector<uint32_t>& hitShapeIds() const { return m_HitShapesIds; }
        void performChanges(StateMachineInstance* stateMachineInstance, Vec2D position) const;
    };
} // namespace rive

#endif