#include "rive/bones/weight.hpp"
#include "rive/container_component.hpp"
#include "rive/shapes/vertex.hpp"

using namespace rive;

StatusCode Weight::onAddedDirty(CoreContext* context) {
    StatusCode code = Super::onAddedDirty(context);
    if (code != StatusCode::Ok) {
        return code;
    }
    if (!parent()->is<Vertex>()) {
        return StatusCode::MissingObject;
    }

    parent()->as<Vertex>()->weight(this);

    return StatusCode::Ok;
}

static int encodedWeightValue(unsigned int index, unsigned int data) {
    return (data >> (index * 8)) & 0xFF;
}

Vec2D Weight::deform(Vec2D inPoint,
                     unsigned int indices,
                     unsigned int weights,
                     const Mat2D& world,
                     const float* boneTransforms) {
    float xx = 0, xy = 0, yx = 0, yy = 0, tx = 0, ty = 0;
    for (int i = 0; i < 4; i++) {
        int weight = encodedWeightValue(i, weights);
        if (weight == 0) {
            continue;
        }

        float normalizedWeight = weight / 255.0f;
        int index = encodedWeightValue(i, indices);
        int startBoneTransformIndex = index * 6;
        xx += boneTransforms[startBoneTransformIndex++] * normalizedWeight;
        xy += boneTransforms[startBoneTransformIndex++] * normalizedWeight;
        yx += boneTransforms[startBoneTransformIndex++] * normalizedWeight;
        yy += boneTransforms[startBoneTransformIndex++] * normalizedWeight;
        tx += boneTransforms[startBoneTransformIndex++] * normalizedWeight;
        ty += boneTransforms[startBoneTransformIndex++] * normalizedWeight;
    }

    return Mat2D(xx, xy, yx, yy, tx, ty) * (world * inPoint);
}
