#include "rive/bones/skin.hpp"
#include "rive/bones/bone.hpp"
#include "rive/bones/skinnable.hpp"
#include "rive/bones/tendon.hpp"
#include "rive/shapes/path_vertex.hpp"
#include "rive/constraints/constraint.hpp"

using namespace rive;

Skin::~Skin() { delete[] m_BoneTransforms; }

StatusCode Skin::onAddedClean(CoreContext* context) {
    m_WorldTransform[0] = xx();
    m_WorldTransform[1] = xy();
    m_WorldTransform[2] = yx();
    m_WorldTransform[3] = yy();
    m_WorldTransform[4] = tx();
    m_WorldTransform[5] = ty();

    m_Skinnable = Skinnable::from(parent());
    if (m_Skinnable == nullptr) {
        return StatusCode::MissingObject;
    }

    m_Skinnable->skin(this);

    return StatusCode::Ok;
}

void Skin::update(ComponentDirt value) {
    int bidx = 6;
    Mat2D world;
    for (auto tendon : m_Tendons) {
        Mat2D::multiply(
            world, tendon->bone()->worldTransform(), tendon->inverseBind());
        m_BoneTransforms[bidx++] = world[0];
        m_BoneTransforms[bidx++] = world[1];
        m_BoneTransforms[bidx++] = world[2];
        m_BoneTransforms[bidx++] = world[3];
        m_BoneTransforms[bidx++] = world[4];
        m_BoneTransforms[bidx++] = world[5];
    }
}

void Skin::buildDependencies() {
    // depend on bones from tendons
    for (auto tendon : m_Tendons) {
        auto bone = tendon->bone();
        bone->addDependent(this);
        for (auto constraint : bone->peerConstraints()) {
            constraint->parent()->addDependent(this);
        }
    }

    // Make sure no-one is calling this twice.
    assert(m_BoneTransforms == nullptr);
    // We can now init the bone buffer.
    auto size = (m_Tendons.size() + 1) * 6;
    m_BoneTransforms = new float[size];
    m_BoneTransforms[0] = 1;
    m_BoneTransforms[1] = 0;
    m_BoneTransforms[2] = 0;
    m_BoneTransforms[3] = 1;
    m_BoneTransforms[4] = 0;
    m_BoneTransforms[5] = 0;
}

void Skin::deform(std::vector<PathVertex*>& vertices) {
    for (auto vertex : vertices) {
        vertex->deform(m_WorldTransform, m_BoneTransforms);
    }
}
void Skin::addTendon(Tendon* tendon) { m_Tendons.push_back(tendon); }

void Skin::onDirty(ComponentDirt dirt) { m_Skinnable->markSkinDirty(); }