#include "rive/viewmodel/property_symbol_dependent.hpp"

using namespace rive;

PropertySymbolDependent::PropertySymbolDependent(
    Core* core,
    CoreObjectListener* coreObjectListener,
    ViewModelInstanceValue* instanceValue)
    : m_coreObject(core)
    , m_coreObjectListener(coreObjectListener)
    , m_instanceValue(instanceValue)
{
  if (m_instanceValue != nullptr)
  {
    m_instanceValue->addDependent(this);
  }
}

PropertySymbolDependent::~PropertySymbolDependent()
{

  if (m_instanceValue != nullptr)
  {
    m_instanceValue->removeDependent(this);
  }
}

void PropertySymbolDependent::addDirt(ComponentDirt value, bool recurse)
{
  writeValue();
  m_coreObjectListener->markDirty();
}

PropertySymbolDependentSingle::PropertySymbolDependentSingle(
    Core* core,
    CoreObjectListener* coreObjectListener,
    ViewModelInstanceValue* instanceValue,
    uint16_t propertyKey)
    : PropertySymbolDependent(core, coreObjectListener, instanceValue)
    , m_propertyKey(propertyKey)
{}

PropertySymbolDependentMulti::PropertySymbolDependentMulti(
    Core* core,
    CoreObjectListener* coreObjectListener,
    ViewModelInstanceValue* instanceValue,
    std::vector<uint16_t> propertyKeys)
    : PropertySymbolDependent(core, coreObjectListener, instanceValue)
    , m_propertyKeys(propertyKeys)
{}

CoreObjectListener::CoreObjectListener(
    Core* core,
    rcp<ViewModelInstance> instance)
    : m_core(core)
    , m_instance(instance)
{}

CoreObjectListener::~CoreObjectListener()
{
  delete m_core;
  deleteProperties();
}

void CoreObjectListener::createProperties() { deleteProperties(); }

void CoreObjectListener::deleteProperties()
{
  for (auto& property : m_properties)
  {
    delete property;
  }
  m_properties.clear();
}

void CoreObjectListener::remap(rcp<ViewModelInstance> instance)
{
  if (instance != m_instance)
  {
    deleteProperties();
    m_instance = instance;
    createProperties();
  }
}