#include "rive/animation/state_machine_event.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/event_input_change.hpp"

using namespace rive;

void StateMachineEvent::addInputChange(EventInputChange* inputChange) {
    m_InputChanges.push_back(inputChange);
}

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

const EventInputChange* StateMachineEvent::inputChange(size_t index) const {
    if (index < m_InputChanges.size()) {
        return m_InputChanges[index];
    }
    return nullptr;
}

StatusCode StateMachineEvent::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 StateMachineEvent::performChanges(StateMachineInstance* stateMachineInstance) const {
    for (auto inputChange : m_InputChanges) {
        inputChange->perform(stateMachineInstance);
    }
}