#ifndef _RIVE_NESTED_ANIMATION_HPP_
#define _RIVE_NESTED_ANIMATION_HPP_
#include "rive/event.hpp"
#include "rive/event_report.hpp"
#include "rive/generated/nested_animation_base.hpp"
#include "rive/nested_artboard.hpp"
#include <stdio.h>
namespace rive
{
class ArtboardInstance;

class NestedEventListener
{
public:
    virtual ~NestedEventListener() {}
    virtual void notify(const std::vector<EventReport>& events, NestedArtboard* context) = 0;
};

class NestedEventNotifier
{
public:
    ~NestedEventNotifier()
    {
        m_nestedArtboard = nullptr;
        m_nestedEventListeners.clear();
    }
    void addNestedEventListener(NestedEventListener* listener)
    {
        m_nestedEventListeners.push_back(listener);
    }
    std::vector<NestedEventListener*> nestedEventListeners() { return m_nestedEventListeners; }

    void setNestedArtboard(NestedArtboard* artboard) { m_nestedArtboard = artboard; }
    NestedArtboard* nestedArtboard() { return m_nestedArtboard; }

    void notifyListeners(const std::vector<Event*>& events)
    {
        std::vector<EventReport> eventReports;
        for (auto event : events)
        {
            eventReports.push_back(EventReport(event, 0));
        }
        for (auto listener : m_nestedEventListeners)
        {
            listener->notify(eventReports, m_nestedArtboard);
        }
    }

private:
    NestedArtboard* m_nestedArtboard;
    std::vector<NestedEventListener*> m_nestedEventListeners;
};

class NestedAnimation : public NestedAnimationBase
{
public:
    StatusCode onAddedDirty(CoreContext* context) override;

    // Advance animations and apply them to the artboard.
    virtual bool advance(float elapsedSeconds) = 0;

    // Initialize the animation (make instances as necessary) from the
    // source artboard.
    virtual void initializeAnimation(ArtboardInstance*) = 0;
};
} // namespace rive

#endif