#include "rive/bones/tendon.hpp"
#include "rive/bones/bone.hpp"
#include "rive/bones/skin.hpp"
#include "rive/core_context.hpp"

using namespace rive;

StatusCode Tendon::onAddedDirty(CoreContext* context)
{
    Mat2D bind;
    bind[0] = xx();
    bind[1] = xy();
    bind[2] = yx();
    bind[3] = yy();
    bind[4] = tx();
    bind[5] = ty();

    // Internally, this inversion can fail because of a division by 0.
    // 'm_InverseBind' will default to an identity matrix. Although
    // this can be treated as undefined behavior, the editor lets it go
    // through, and nothing really breaks, it just can look odd. So we
    // allow the runtime to behave in the same way and return StatusCode::Ok.
    bind.invert(&m_InverseBind);

    StatusCode code = Super::onAddedDirty(context);
    if (code != StatusCode::Ok)
    {
        return code;
    }
    auto coreObject = context->resolve(boneId());
    if (coreObject == nullptr || !coreObject->is<Bone>())
    {
        return StatusCode::MissingObject;
    }

#ifdef WITH_RIVE_EDITOR
    setBoneForEditor(static_cast<Bone*>(coreObject));
#else
    m_Bone = static_cast<Bone*>(coreObject);
#endif

    return StatusCode::Ok;
}

StatusCode Tendon::onAddedClean(CoreContext* context)
{
    if (!parent()->is<Skin>())
    {
        return StatusCode::MissingObject;
    }

    parent()->as<Skin>()->addTendon(this);

    return StatusCode::Ok;
}

#ifdef WITH_RIVE_EDITOR
void Tendon::resolveBone(CoreContext* context)
{
    if (bone() != nullptr)
    {
        return;
    }
    auto* core = context->resolve(boneId());
    if (core != nullptr && core->is<Bone>())
    {
        setBoneForEditor(static_cast<Bone*>(core));
    }
}
#endif
