#ifndef _RIVE_NESTED_ARTBOARD_LAYOUT_HPP_
#define _RIVE_NESTED_ARTBOARD_LAYOUT_HPP_
#include "rive/generated/nested_artboard_layout_base.hpp"
#include "rive/constraints/layout_constraint.hpp"
#include "rive/layout/layout_node_provider.hpp"
#include "rive/layout/style_overrider.hpp"
#include "rive/viewmodel/viewmodel_instance_artboard.hpp"

namespace rive
{
class ArtboardInstance;
class NestedArtboardLayout : public NestedArtboardLayoutBase,
                             public LayoutNodeProvider
{
public:
#ifdef WITH_RIVE_LAYOUT
    void* layoutNode(int index) override;
#endif
    Core* clone() const override;
    void markHostingLayoutDirty(ArtboardInstance* artboardInstance) override;
    void markLayoutNodeDirty(
        bool shouldForceUpdateLayoutBounds = false) override;
    void updateConstraints() override;
    StatusCode onAddedClean(CoreContext* context) override;

    bool syncStyleChanges() override;
    void updateLayoutBounds(bool animate = true) override;
#ifdef WITH_RIVE_LAYOUT
    bool cascadeLayoutStyle(LayoutStyleInterpolation inheritedInterpolation,
                            KeyFrameInterpolator* inheritedInterpolator,
                            float inheritedInterpolationTime,
                            LayoutDirection direction) override;
#endif
    AABB layoutBounds() override;
    size_t numLayoutNodes() override { return 1; }
    bool isLayoutProvider() override { return true; }
    void updateArtboard(
        ViewModelInstanceArtboard* viewModelInstanceArtboard) override;

    TransformComponent* transformComponent() override
    {
        return this->as<TransformComponent>();
    }
    bool isRow();
    bool isStack();

protected:
    void instanceWidthChanged() override;
    void instanceHeightChanged() override;
    void instanceWidthUnitsValueChanged() override;
    void instanceHeightUnitsValueChanged() override;
    void instanceWidthScaleTypeChanged() override;
    void instanceHeightScaleTypeChanged() override;

private:
    void applyLayoutPlacement();
    void updateWidthOverride();
    void updateHeightOverride();
    StyleOverrider<NestedArtboardLayout> m_styleOverrider =
        StyleOverrider<NestedArtboardLayout>(this);
};
} // namespace rive

#endif