# FindImguiNodeEditor.cmake - Find or configure thedmd/imgui-node-editor
#
# This module looks for imgui-node-editor at src/ui/NodeEditor (an in-tree,
# version-controlled subset of the upstream library — MIT licensed, see
# src/ui/NodeEditor/LICENSE — containing only the files this project's build
# actually compiles; the full upstream drop, including the standalone example
# app used to reproduce library-level bugs against a pure reference build,
# stays vendored separately at third_party/imgui-node-editor) and compiles its
# sources directly against this project's own Imgui::Imgui target so it shares
# the exact same ImGui headers/defines (no second copy of ImGui is pulled in).
#
# Inputs:
#   IMGUI_NODE_EDITOR_DIR - Path to imgui-node-editor/NodeEditor root
#
# Outputs:
#   ImguiNodeEditor_FOUND
#   ImguiNodeEditor::ImguiNodeEditor  (imported STATIC target)

if(NOT IMGUI_NODE_EDITOR_DIR)
    set(IMGUI_NODE_EDITOR_DIR "${CMAKE_SOURCE_DIR}/src/ui/NodeEditor")
endif()

if(NOT IMGUI_NODE_EDITOR_BLUEPRINT_UTILITIES_DIR)
    set(IMGUI_NODE_EDITOR_BLUEPRINT_UTILITIES_DIR
        "${CMAKE_SOURCE_DIR}/src/ui/NodeEditor/BlueprintWidgets")
endif()

find_path(ImguiNodeEditor_INCLUDE_DIR
    NAMES imgui_node_editor.h
    PATHS "${IMGUI_NODE_EDITOR_DIR}/Include"
    NO_DEFAULT_PATH
)

set(ImguiNodeEditor_SOURCES
    "${IMGUI_NODE_EDITOR_DIR}/Source/crude_json.cpp"
    "${IMGUI_NODE_EDITOR_DIR}/Source/imgui_canvas.cpp"
    "${IMGUI_NODE_EDITOR_DIR}/Source/imgui_node_editor_api.cpp"
    "${IMGUI_NODE_EDITOR_DIR}/Source/imgui_node_editor.cpp"
    # Blueprint pin-icon widgets (Widgets/Drawing only — Builders.cpp is
    # intentionally excluded, it needs Spring()/BeginHorizontal()/BeginVertical()
    # from thedmd's own ImGui fork, which this project's vanilla ImGui lacks).
    "${IMGUI_NODE_EDITOR_BLUEPRINT_UTILITIES_DIR}/Source/ax/Drawing.cpp"
    "${IMGUI_NODE_EDITOR_BLUEPRINT_UTILITIES_DIR}/Source/ax/Widgets.cpp"
)

foreach(_src ${ImguiNodeEditor_SOURCES})
    if(NOT EXISTS "${_src}")
        set(ImguiNodeEditor_SOURCES_MISSING TRUE)
    endif()
endforeach()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ImguiNodeEditor
    REQUIRED_VARS ImguiNodeEditor_INCLUDE_DIR
    FAIL_MESSAGE "imgui-node-editor not found — expected it at src/ui/NodeEditor"
)

if(ImguiNodeEditor_FOUND AND ImguiNodeEditor_SOURCES_MISSING)
    message(FATAL_ERROR "imgui-node-editor sources missing under ${IMGUI_NODE_EDITOR_DIR}/Source")
endif()

if(ImguiNodeEditor_FOUND AND NOT TARGET ImguiNodeEditor::ImguiNodeEditor)
    add_library(imgui_node_editor_impl STATIC ${ImguiNodeEditor_SOURCES})

    target_include_directories(imgui_node_editor_impl
        PUBLIC  "${ImguiNodeEditor_INCLUDE_DIR}"
                "${IMGUI_NODE_EDITOR_BLUEPRINT_UTILITIES_DIR}/Include"
        PRIVATE "${IMGUI_NODE_EDITOR_DIR}/Source"
                "${IMGUI_NODE_EDITOR_BLUEPRINT_UTILITIES_DIR}/Source"
    )

    # Must be defined before the first #include <imgui.h> in every translation
    # unit (imgui_internal.h hard-errors otherwise) — a command-line define
    # guarantees that ordering regardless of vendored include order.
    target_compile_definitions(imgui_node_editor_impl PRIVATE IMGUI_DEFINE_MATH_OPERATORS)

    # Must share this project's own ImGui build (same headers/defines) rather
    # than pulling in a second ImGui — imgui-node-editor only needs the public
    # API plus ImRect/ImFloor from imgui_internal.h.
    target_link_libraries(imgui_node_editor_impl PUBLIC Imgui::Imgui)

    add_library(ImguiNodeEditor::ImguiNodeEditor ALIAS imgui_node_editor_impl)
    message(STATUS "imgui-node-editor found: ${ImguiNodeEditor_INCLUDE_DIR}")
endif()

mark_as_advanced(ImguiNodeEditor_INCLUDE_DIR)
