#include "rive/animation/state_machine_listener.hpp"
#include "rive/importers/import_stack.hpp"
#include "rive/importers/state_machine_importer.hpp"
#include "rive/generated/animation/state_machine_base.hpp"
#include "rive/artboard.hpp"
#include "rive/shapes/shape.hpp"
#include "rive/animation/state_machine_instance.hpp"
#include "rive/animation/listener_input_change.hpp"

using namespace rive;

void StateMachineListener::addAction(ListenerAction* action) { m_Actions.push_back(action); }

StatusCode StateMachineListener::import(ImportStack& importStack) {
    auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachineBase::typeKey);
    if (stateMachineImporter == nullptr) {
        return StatusCode::MissingObject;
    }
    // Handing off ownership of this!
    stateMachineImporter->addListener(std::unique_ptr<StateMachineListener>(this));
    return Super::import(importStack);
}

const ListenerAction* StateMachineListener::action(size_t index) const {
    if (index < m_Actions.size()) {
        return m_Actions[index];
    }
    return nullptr;
}

StatusCode StateMachineListener::onAddedClean(CoreContext* context) {
    auto artboard = static_cast<Artboard*>(context);
    auto target = artboard->resolve(targetId());

    for (auto core : artboard->objects()) {
        if (core == nullptr) {
            continue;
        }

        // Iterate artboard to find Shapes that are parented to the target
        if (core->is<Shape>()) {
            auto shape = core->as<Shape>();

            for (ContainerComponent* component = shape; component != nullptr;
                 component = component->parent()) {
                if (component == target) {
                    auto index = artboard->idOf(shape);
                    if (index != 0) {
                        m_HitShapesIds.push_back(index);
                    }
                    break;
                }
            }
        }
    }

    return Super::onAddedClean(context);
}

void StateMachineListener::performChanges(StateMachineInstance* stateMachineInstance,
                                          Vec2D position) const {
    for (auto action : m_Actions) {
        action->perform(stateMachineInstance, position);
    }
}