#include "rive/component.hpp"
#include "rive/artboard.hpp"
#include "rive/container_component.hpp"
#include "rive/core_context.hpp"
#include "rive/importers/artboard_importer.hpp"
#include "rive/importers/import_stack.hpp"
#include <algorithm>

using namespace rive;

StatusCode Component::onAddedDirty(CoreContext* context) {
    m_Artboard = static_cast<Artboard*>(context);
    if (this == m_Artboard) {
        // We're the artboard, don't parent to ourselves.
        return StatusCode::Ok;
    }
    auto coreObject = context->resolve(parentId());
    if (coreObject == nullptr || !coreObject->is<ContainerComponent>()) {
        return StatusCode::MissingObject;
    }
    m_Parent = reinterpret_cast<ContainerComponent*>(coreObject);
    return StatusCode::Ok;
}

void Component::addDependent(Component* component) {
    // Make it's not already a dependent.
    if (std::find(m_Dependents.begin(), m_Dependents.end(), component) != m_Dependents.end()) {
        return;
    }
    m_Dependents.push_back(component);
}

bool Component::addDirt(ComponentDirt value, bool recurse) {
    if ((m_Dirt & value) == value) {
        // Already marked.
        return false;
    }

    // Make sure dirt is set before calling anything that can set more dirt.
    m_Dirt |= value;

    onDirty(m_Dirt);

    m_Artboard->onComponentDirty(this);

    if (!recurse) {
        return true;
    }

    for (auto d : m_Dependents) {
        d->addDirt(value, true);
    }
    return true;
}

StatusCode Component::import(ImportStack& importStack) {
    if (is<Artboard>()) {
        // Artboards are always their first object.
        assert(as<Artboard>()->objects().size() == 0);
        as<Artboard>()->addObject(this);
        return Super::import(importStack);
    }

    auto artboardImporter = importStack.latest<ArtboardImporter>(ArtboardBase::typeKey);
    if (artboardImporter == nullptr) {
        return StatusCode::MissingObject;
    }
    artboardImporter->addComponent(this);
    return Super::import(importStack);
}