set(RL_TOOLS_ENABLE_HYPERDRONE_SPY OFF PARENT_SCOPE)
if(RL_TOOLS_DISABLE_HYPERDRONE_SPY)
    return()
endif()
if(NOT RL_TOOLS_RENDERING_ENABLE_RAYTRACING)
    set(RL_TOOLS_SUMMARY_HYPERDRONE_SPY_REASON "raytracing unavailable" PARENT_SCOPE)
    return()
endif()

find_package(glfw3 QUIET)
find_package(OpenGL QUIET)
if(NOT TARGET glfw OR NOT TARGET OpenGL::GL)
    set(RL_TOOLS_SUMMARY_HYPERDRONE_SPY_REASON "GLFW/OpenGL not found (e.g. apt install libglfw3-dev libgl1-mesa-dev)" PARENT_SCOPE)
    return()
endif()

set(RL_TOOLS_IMGUI_SOURCE_DIR "$ENV{RL_TOOLS_IMGUI_SOURCE_DIR}" CACHE PATH "Path to existing Dear ImGui sources for the HyperDrone spy")
if(RL_TOOLS_IMGUI_SOURCE_DIR)
    foreach(_source imgui.cpp imgui_draw.cpp imgui_tables.cpp imgui_widgets.cpp backends/imgui_impl_glfw.cpp backends/imgui_impl_opengl3.cpp)
        if(NOT EXISTS "${RL_TOOLS_IMGUI_SOURCE_DIR}/${_source}")
            message(FATAL_ERROR "RL_TOOLS_IMGUI_SOURCE_DIR is missing ${_source}")
        endif()
    endforeach()
    set(_imgui_sources "${RL_TOOLS_IMGUI_SOURCE_DIR}/imgui.cpp" "${RL_TOOLS_IMGUI_SOURCE_DIR}/imgui_draw.cpp" "${RL_TOOLS_IMGUI_SOURCE_DIR}/imgui_tables.cpp" "${RL_TOOLS_IMGUI_SOURCE_DIR}/imgui_widgets.cpp")
    set(_imgui_include_dirs "${RL_TOOLS_IMGUI_SOURCE_DIR}" "${RL_TOOLS_IMGUI_SOURCE_DIR}/backends")
    set(_imgui_backend_dir "${RL_TOOLS_IMGUI_SOURCE_DIR}/backends")
    set(_imgui_reason "Dear ImGui sources ${RL_TOOLS_IMGUI_SOURCE_DIR}")
else()
    find_package(PkgConfig QUIET)
    if(PkgConfig_FOUND)
        pkg_check_modules(RL_TOOLS_SPY_IMGUI QUIET IMPORTED_TARGET imgui>=1.86)
    endif()
    find_path(RL_TOOLS_IMGUI_BACKENDS_DIR NAMES imgui_impl_glfw.cpp HINTS ${RL_TOOLS_SPY_IMGUI_INCLUDE_DIRS} PATHS /usr/share/doc/libimgui-dev/examples /usr/local/share/imgui /usr/share/imgui PATH_SUFFIXES backends)
    if(NOT TARGET PkgConfig::RL_TOOLS_SPY_IMGUI OR NOT EXISTS "${RL_TOOLS_IMGUI_BACKENDS_DIR}/imgui_impl_opengl3.cpp")
        set(RL_TOOLS_SUMMARY_HYPERDRONE_SPY_REASON "Dear ImGui not found (e.g. apt install libimgui-dev, or set RL_TOOLS_IMGUI_SOURCE_DIR)" PARENT_SCOPE)
        return()
    endif()
    find_path(RL_TOOLS_IMGUI_BACKENDS_INCLUDE_DIR NAMES imgui_impl_glfw.h HINTS ${RL_TOOLS_SPY_IMGUI_INCLUDE_DIRS} "${RL_TOOLS_IMGUI_BACKENDS_DIR}" PATH_SUFFIXES backends)
    if(NOT RL_TOOLS_IMGUI_BACKENDS_INCLUDE_DIR)
        set(RL_TOOLS_SUMMARY_HYPERDRONE_SPY_REASON "Dear ImGui backend headers not found" PARENT_SCOPE)
        return()
    endif()
    set(_imgui_backend_dir "${RL_TOOLS_IMGUI_BACKENDS_DIR}")
    set(_imgui_include_dirs "${RL_TOOLS_IMGUI_BACKENDS_INCLUDE_DIR}")
    set(_imgui_reason "system Dear ImGui ${RL_TOOLS_SPY_IMGUI_VERSION}")
endif()

find_package(Threads REQUIRED)
add_library(rl_tools_hyperdrone_spy SHARED ui.cpp ${_imgui_sources} "${_imgui_backend_dir}/imgui_impl_glfw.cpp" "${_imgui_backend_dir}/imgui_impl_opengl3.cpp")
add_library(RLtools::HyperDroneSpy ALIAS rl_tools_hyperdrone_spy)
target_link_libraries(rl_tools_hyperdrone_spy PUBLIC RLtools::Core Threads::Threads PRIVATE glfw OpenGL::GL ${CMAKE_DL_LIBS})
if(TARGET PkgConfig::RL_TOOLS_SPY_IMGUI AND NOT RL_TOOLS_IMGUI_SOURCE_DIR)
    target_link_libraries(rl_tools_hyperdrone_spy PRIVATE PkgConfig::RL_TOOLS_SPY_IMGUI)
endif()
target_include_directories(rl_tools_hyperdrone_spy SYSTEM PRIVATE ${_imgui_include_dirs})
target_compile_definitions(rl_tools_hyperdrone_spy PUBLIC RL_TOOLS_ENABLE_HYPERDRONE_SPY=1)
set_target_properties(rl_tools_hyperdrone_spy PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON WINDOWS_EXPORT_ALL_SYMBOLS ON)
if(NOT RL_TOOLS_DISABLE_TARGETS)
    add_executable(example_hyperdrone_spy example.cpp)
    target_link_libraries(example_hyperdrone_spy PRIVATE RLtools::RLtools RLtools::HyperDroneSpy rendering_raytracing_backend rendering_raytracing_stb)
endif()
set(RL_TOOLS_ENABLE_HYPERDRONE_SPY ON PARENT_SCOPE)
set(RL_TOOLS_SUMMARY_HYPERDRONE_SPY_REASON "GLFW/OpenGL, ${_imgui_reason}" PARENT_SCOPE)
