set(GODOTCPP_API_VERSION "4.7" CACHE STRING "Pinned Godot API" FORCE)
set(GODOTCPP_DISABLE_EXCEPTIONS OFF CACHE BOOL "Catch at extension callbacks" FORCE)
set(GODOTCPP_USE_STATIC_CPP ON CACHE BOOL "Match host C++ runtime" FORCE)
set(GODOTCPP_DEBUG_CRT OFF CACHE BOOL "Use the standard Godot static CRT" FORCE)
set(GODOTCPP_BUILD_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/build_profile.json" CACHE FILEPATH "Minimal host bindings" FORCE)
set(_cpp "${CMAKE_CURRENT_SOURCE_DIR}/third_party/godot-cpp")
if(NOT EXISTS "${_cpp}/.roadwars_commit")
  message(FATAL_ERROR "Run python scripts/build.py deps first")
endif()
file(READ "${_cpp}/.roadwars_commit" _commit)
string(STRIP "${_commit}" _commit)
if(NOT _commit STREQUAL "cedbd9e71b24eb2898b28867c5faf6114da9e5e2")
  message(FATAL_ERROR "godot-cpp commit does not match lock")
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
  set(GODOTCPP_TARGET "template_release" CACHE STRING "Match Release export" FORCE)
endif()
add_subdirectory(third_party/godot-cpp)
file(READ "${PROJECT_SOURCE_DIR}/scripts/dependencies.lock.json" _dependency_lock)
foreach(_dependency IN ITEMS imgui imgui-console)
  set(_marker "${CMAKE_CURRENT_SOURCE_DIR}/third_party/${_dependency}/.roadwars_commit")
  if(NOT EXISTS "${_marker}")
    message(FATAL_ERROR "Missing ${_dependency}. Run python scripts/build.py deps")
  endif()
  file(READ "${_marker}" _actual_commit)
  string(STRIP "${_actual_commit}" _actual_commit)
  string(JSON _expected_commit GET "${_dependency_lock}" "${_dependency}" "commit")
  if(NOT _actual_commit STREQUAL _expected_commit)
    message(FATAL_ERROR "${_dependency} commit does not match lock")
  endif()
endforeach()
set(_imgui "${CMAKE_CURRENT_SOURCE_DIR}/third_party/imgui")
set(_console "${CMAKE_CURRENT_SOURCE_DIR}/third_party/imgui-console")
add_library(roadwars_imgui STATIC ${_imgui}/imgui.cpp ${_imgui}/imgui_draw.cpp
  ${_imgui}/imgui_tables.cpp ${_imgui}/imgui_widgets.cpp ${_console}/src/imgui_console.cpp
  ${PROJECT_SOURCE_DIR}/game_src/extensions/debug_overlay.cpp
  ${PROJECT_SOURCE_DIR}/game_src/extensions/console_streams.cpp)
target_include_directories(roadwars_imgui PUBLIC ${PROJECT_SOURCE_DIR} ${_imgui} ${_console}/include
  ${_console}/include/imgui_console)
set_target_properties(roadwars_imgui PROPERTIES POSITION_INDEPENDENT_CODE ON)
add_library(roadwars_godot SHARED extension/register_types.cpp extension/game_host.cpp extension/game_files.cpp extension/engine_audio_adapter.cpp extension/sfx_audio_adapter.cpp rendering/server_renderer.cpp)
target_sources(roadwars_godot PRIVATE extension/debug_overlay.cpp extension/startup_directory.cpp extension/graphics_settings_adapter.cpp)
target_sources(roadwars_godot PRIVATE extension/original_weapon_input.cpp)
target_sources(roadwars_godot PRIVATE extension/combat_audio_adapter.cpp)
target_sources(roadwars_godot PRIVATE extension/frontend_video_audio.cpp)
target_sources(roadwars_godot PRIVATE extension/sound_options_adapter.cpp)
if(WIN32)
  target_link_libraries(roadwars_godot PRIVATE msacm32)
endif()
set(_shader_dir "${PROJECT_SOURCE_DIR}/game_src/shader")
file(READ "${_shader_dir}/billboard_basis.gdshaderinc" RW_BILLBOARD_BASIS)
file(READ "${_shader_dir}/original_surface.gdshader" RW_SURFACE_SHADER)
file(READ "${_shader_dir}/original_particle.gdshader" RW_PARTICLE_SHADER)
foreach(_source IN ITEMS RW_SURFACE_SHADER RW_PARTICLE_SHADER)
  string(REPLACE "#include \"billboard_basis.gdshaderinc\"" "${RW_BILLBOARD_BASIS}"
    ${_source} "${${_source}}")
endforeach()
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
  "${_shader_dir}/billboard_basis.gdshaderinc" "${_shader_dir}/original_surface.gdshader"
  "${_shader_dir}/original_particle.gdshader")
configure_file(rendering/shader_sources.hpp.in generated/shader_sources.hpp @ONLY)
target_include_directories(roadwars_godot PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/generated")
target_link_libraries(roadwars_godot PRIVATE roadwars_core godot-cpp roadwars_imgui)
target_include_directories(roadwars_godot PRIVATE ${PROJECT_SOURCE_DIR})
if(CMAKE_BUILD_TYPE STREQUAL "Release")
  set(_extension_output "${PROJECT_BINARY_DIR}/extension-bin")
else()
  set(_extension_output "${CMAKE_CURRENT_SOURCE_DIR}/project/bin")
endif()
set_target_properties(roadwars_godot PROPERTIES PREFIX "" OUTPUT_NAME "roadwars_godot"
  RUNTIME_OUTPUT_DIRECTORY "${_extension_output}"
  LIBRARY_OUTPUT_DIRECTORY "${_extension_output}")
if(MINGW)
  target_link_options(roadwars_godot PRIVATE -static-libgcc -static-libstdc++)
endif()

if(BUILD_TESTING)
  add_executable(roadwars_frontend_video_audio_test ${PROJECT_SOURCE_DIR}/tests/platform/frontend_video_audio_test.cpp extension/frontend_video_audio.cpp)
  target_link_libraries(roadwars_frontend_video_audio_test PRIVATE roadwars_core)
  if(WIN32)
    target_link_libraries(roadwars_frontend_video_audio_test PRIVATE msacm32)
  endif()
  add_test(NAME frontend_video_audio COMMAND roadwars_frontend_video_audio_test)
  add_executable(roadwars_debug_overlay_test ${PROJECT_SOURCE_DIR}/tests/extensions/debug_overlay_test.cpp)
  target_link_libraries(roadwars_debug_overlay_test PRIVATE roadwars_imgui)
  add_test(NAME debug_overlay COMMAND roadwars_debug_overlay_test)
endif()
