#include <sstream>
#include <iomanip>
#include <array>

#include "rive/viewmodel/viewmodel_instance_enum.hpp"
#include "rive/viewmodel/viewmodel_property_enum.hpp"
#include "rive/component_dirt.hpp"

using namespace rive;

void ViewModelInstanceEnum::propertyValueChanged()
{
    addDirt(ComponentDirt::Bindings);
#ifdef WITH_RIVE_TOOLS
    if (m_changedCallback != nullptr)
    {
        m_changedCallback(this, propertyValue());
    }
#endif
    onValueChanged();
}

bool ViewModelInstanceEnum::value(std::string name)
{
    auto enumProperty = viewModelProperty()->as<ViewModelPropertyEnum>();
    int index = enumProperty->valueIndex(name);
    if (index != -1)
    {
        propertyValue(index);
        return true;
    }
    return false;
}

bool ViewModelInstanceEnum::value(uint32_t index)
{
    auto enumProperty = viewModelProperty()->as<ViewModelPropertyEnum>();
    if (enumProperty->valueIndex(index) != -1)
    {
        propertyValue(index);
        return true;
    }
    return false;
}

void ViewModelInstanceEnum::applyValue(DataValueInteger* dataValue)
{
    propertyValue(dataValue->value());
}