#include "rive/animation/animation_reset.hpp"
#include "rive/core/vector_binary_writer.hpp"
#include "rive/generated/core_registry.hpp"

using namespace rive;

AnimationReset::AnimationReset() :
    m_binaryWriter(&m_WriteBuffer), m_binaryReader(nullptr, 0)
{}

void AnimationReset::writeObjectId(uint32_t objectId)
{
    m_binaryWriter.writeVarUint(objectId);
}

void AnimationReset::writeTotalProperties(uint32_t value)
{
    m_binaryWriter.writeVarUint(value);
}

void AnimationReset::writePropertyKey(uint32_t value)
{
    m_binaryWriter.writeVarUint(value);
}

void AnimationReset::writePropertyValue(float value)
{
    m_binaryWriter.writeFloat(value);
}

void AnimationReset::clear() { m_binaryWriter.clear(); }

void AnimationReset::complete()
{
    if (!m_WriteBuffer.empty())
    {
        m_binaryReader.complete(&m_WriteBuffer.front(), m_binaryWriter.size());
    }
}

void AnimationReset::apply(Artboard* artboard)
{
    if (m_WriteBuffer.empty())
    {
        return;
    }
    m_binaryReader.reset(&m_WriteBuffer.front());
    while (!m_binaryReader.isEOF())
    {
        auto objectId = m_binaryReader.readVarUint32();
        auto object = artboard->resolve(objectId);
        auto totalProperties = m_binaryReader.readVarUint32();
        uint32_t currentPropertyIndex = 0;
        while (currentPropertyIndex < totalProperties)
        {
            auto propertyKey = m_binaryReader.readVarUint32();
            auto propertyValue = m_binaryReader.readFloat32();
            switch (CoreRegistry::propertyFieldId(propertyKey))
            {
                case CoreDoubleType::id:
                    CoreRegistry::setDouble(object, propertyKey, propertyValue);
                    break;
                case CoreColorType::id:
                    CoreRegistry::setColor(object, propertyKey, propertyValue);
                    break;
            }
            currentPropertyIndex++;
        }
    }
}
