cmake_minimum_required(VERSION 3.20)
project(shadowtower_launcher LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
find_package(SDL3 3.4 CONFIG REQUIRED)
find_package(OpenGL REQUIRED)
find_package(Threads REQUIRED)
include(../cmake/dependencies.cmake)
include(FetchContent)
if(POLICY CMP0135)
  cmake_policy(SET CMP0135 NEW)
endif()
# Release payloads include these sources so rebuilding does not require network
# access.
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/bundled-imgui/imgui.cpp")
  set(FETCHCONTENT_SOURCE_DIR_IMGUI "${CMAKE_CURRENT_SOURCE_DIR}/bundled-imgui")
endif()
FetchContent_Declare(
  imgui
  URL https://codeload.github.com/ocornut/imgui/tar.gz/refs/tags/v1.91.9b
  URL_HASH
    SHA256=8e1bbc76c71d74fef2fb85db7e7ca8eba13d6a86623c54992b60162db554ffdb)
FetchContent_MakeAvailable(imgui)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/imgui-source-dir.txt"
     "${imgui_SOURCE_DIR}\n")
add_executable(
  shadowtower-launcher
  main.cpp
  ${PSXRECOMP_ROOT}/runtime/src/psx_sha256.c
  ${imgui_SOURCE_DIR}/imgui.cpp
  ${imgui_SOURCE_DIR}/imgui_draw.cpp
  ${imgui_SOURCE_DIR}/imgui_tables.cpp
  ${imgui_SOURCE_DIR}/imgui_widgets.cpp
  ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp
  ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp)
target_compile_features(shadowtower-launcher PRIVATE cxx_std_17)
target_compile_definitions(shadowtower-launcher PRIVATE IMGUI_USE_WCHAR32)
target_include_directories(shadowtower-launcher
                           PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../src)
target_include_directories(
  shadowtower-launcher SYSTEM
  PRIVATE ${imgui_SOURCE_DIR}
          ${imgui_SOURCE_DIR}/backends
          ${PSXRECOMP_ROOT}/runtime/third_party
          ${PSXRECOMP_ROOT}/runtime/include
          ${PSXRECOMP_ROOT}/recompiler/lib/toml11)
if(WIN32)
  if(NOT TARGET SDL3::SDL3-static)
    message(
      FATAL_ERROR
        "The standalone Windows launcher requires the bundled static SDL3 SDK.")
  endif()
  target_link_libraries(shadowtower-launcher PRIVATE SDL3::SDL3-static)
  if(MINGW)
    target_link_options(shadowtower-launcher PRIVATE -static -static-libgcc
                        -static-libstdc++)
  elseif(MSVC)
    set_property(
      TARGET shadowtower-launcher
      PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
  endif()
else()
  target_link_libraries(shadowtower-launcher PRIVATE SDL3::SDL3)
endif()
target_link_libraries(shadowtower-launcher PRIVATE OpenGL::GL Threads::Threads)
option(SHADOWTOWER_WARNINGS_AS_ERRORS
       "Build the launcher's own sources with -Wall -Wextra -Werror" OFF)
if(SHADOWTOWER_WARNINGS_AS_ERRORS)
  set_source_files_properties(
    main.cpp model_tests.cpp bindings_tests.cpp keyboard_tests.cpp
    PROPERTIES COMPILE_OPTIONS "-Wall;-Wextra;-Werror")
endif()
include(CTest)
if(BUILD_TESTING)
  add_executable(launcher-model-tests
                 model_tests.cpp ${PSXRECOMP_ROOT}/runtime/src/psx_sha256.c)
  target_compile_features(launcher-model-tests PRIVATE cxx_std_17)
  target_include_directories(launcher-model-tests
                             PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../src)
  target_include_directories(
    launcher-model-tests SYSTEM PRIVATE ${PSXRECOMP_ROOT}/runtime/include
                                        ${PSXRECOMP_ROOT}/recompiler/lib/toml11)
  add_test(NAME launcher-model COMMAND launcher-model-tests)
  add_executable(launcher-bindings-tests bindings_tests.cpp)
  target_compile_features(launcher-bindings-tests PRIVATE cxx_std_17)
  add_test(NAME launcher-bindings COMMAND launcher-bindings-tests)
  add_executable(launcher-keyboard-tests keyboard_tests.cpp)
  target_compile_features(launcher-keyboard-tests PRIVATE cxx_std_17)
  target_include_directories(launcher-keyboard-tests
                             PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../src)
  add_test(NAME launcher-keyboard COMMAND launcher-keyboard-tests)
endif()
