/*
 * Copyright 2024 Rive
 */

#include "rive/input/focus_node.hpp"
#include <algorithm>
#include <cstddef>

namespace rive
{

FocusNode::~FocusNode()
{
    // A child held elsewhere via rcp (a NestedArtboard's persistent focus
    // scope, an ArtboardComponentList row) can outlive this node, so clear its
    // back-pointer to keep m_parent from dangling.
    for (const auto& child : m_children)
    {
        child->m_parent = nullptr;
    }
}

void FocusNode::addChild(rcp<FocusNode> child)
{
    insertChild(m_children.size(), std::move(child));
}

void FocusNode::insertChild(size_t index, rcp<FocusNode> child)
{
    if (!child)
    {
        return;
    }
    child->removeFromParent();
    child->m_parent = this;
    if (index > m_children.size())
    {
        index = m_children.size();
    }
    m_children.insert(m_children.begin() + static_cast<ptrdiff_t>(index),
                      std::move(child));
}

void FocusNode::removeChild(rcp<FocusNode> child)
{
    if (!child || child->m_parent != this)
    {
        return;
    }

    child->m_parent = nullptr;
    auto it = std::find(m_children.begin(), m_children.end(), child);
    if (it != m_children.end())
    {
        m_children.erase(it);
    }
}

void FocusNode::removeFromParent()
{
    if (m_parent)
    {
        m_parent->removeChild(ref_rcp(this));
    }
}

} // namespace rive
