#include "rive/animation/transition_bool_condition.hpp"
#include "rive/animation/state_transition.hpp"
#include "rive/importers/state_transition_importer.hpp"
#include "rive/importers/state_machine_importer.hpp"
#include "rive/animation/state_machine.hpp"

using namespace rive;

StatusCode TransitionCondition::onAddedDirty(CoreContext* context)
{
    return StatusCode::Ok;
}

StatusCode TransitionCondition::onAddedClean(CoreContext* context)
{
    return StatusCode::Ok;
}

StatusCode TransitionCondition::import(ImportStack& importStack)
{
    auto stateMachineImporter =
        importStack.latest<StateMachineImporter>(StateMachine::typeKey);
    if (stateMachineImporter == nullptr)
    {
        return StatusCode::MissingObject;
    }

    // Make sure the inputId doesn't overflow the input buffer.
    if (inputId() < 0 ||
        inputId() >= stateMachineImporter->stateMachine()->inputCount())
    {
        return StatusCode::InvalidObject;
    }
    if (!validateInputType(
            stateMachineImporter->stateMachine()->input((size_t)inputId())))
    {
        return StatusCode::InvalidObject;
    }

    auto transitionImporter =
        importStack.latest<StateTransitionImporter>(StateTransition::typeKey);
    if (transitionImporter == nullptr)
    {
        return StatusCode::MissingObject;
    }
    transitionImporter->addCondition(this);
    return Super::import(importStack);
}