#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(uint8_t value) { m_binaryWriter.write(value); }

void AnimationReset::writePropertyKey(uint8_t value) { m_binaryWriter.write(value); }

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

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

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

void AnimationReset::apply(Artboard* artboard)
{
    m_binaryReader.reset(&m_WriteBuffer.front());
    while (!m_binaryReader.isEOF())
    {
        auto objectId = m_binaryReader.readVarUint32();
        auto object = artboard->resolve(objectId);
        auto totalProperties = m_binaryReader.readByte();
        auto currentPropertyIndex = 0;
        while (currentPropertyIndex < totalProperties)
        {
            auto propertyKey = m_binaryReader.readByte();
            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++;
        }
    }
}
