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

using namespace rive;

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

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

    return StatusCode::Ok;
}

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

void Weight::deform(float x,
                    float y,
                    unsigned int indices,
                    unsigned int weights,
                    const Mat2D& world,
                    const float* boneTransforms,
                    Vec2D& result) {
    float xx = 0, xy = 0, yx = 0, yy = 0, tx = 0, ty = 0;
    float rx = world[0] * x + world[2] * y + world[4];
    float ry = world[1] * x + world[3] * y + world[5];
    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;
    }
    result[0] = xx * rx + yx * ry + tx;
    result[1] = xy * rx + yy * ry + ty;
}