cmake_minimum_required(VERSION 3.20)
project(srw64_runtime_foundation VERSION 0.5.3.1 LANGUAGES C CXX)
# Base tests are ROM/RT64/Python-free. This is NOT the game build entry.
include(CTest)
add_subdirectory(src/native/app)
if(BUILD_TESTING)
    add_executable(srw64-app-test tests/native_app.cpp)
    target_link_libraries(srw64-app-test PRIVATE srw64_app)
    add_executable(srw64-import-codec-test tests/native_rom_import_codec.cpp)
    target_link_libraries(srw64-import-codec-test PRIVATE srw64_app)
    add_executable(srw64-save-test tests/native_save.cpp)
    target_link_libraries(srw64-save-test PRIVATE srw64_app)
    add_executable(srw64-touch-pad-test tests/native_touch_pad.cpp)
    target_compile_features(srw64-touch-pad-test PRIVATE cxx_std_20)
    add_executable(srw64-update-test tests/native_update.cpp)
    target_compile_features(srw64-update-test PRIVATE cxx_std_20)
    foreach(target srw64-app-test srw64-import-codec-test srw64-save-test srw64-touch-pad-test srw64-update-test)
        if(MSVC)
            target_compile_options(${target} PRIVATE /W4 /utf-8)
        else()
            target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic)
        endif()
    endforeach()
    add_test(NAME native-app COMMAND srw64-app-test)
    add_test(NAME native-import-codec COMMAND srw64-import-codec-test)
    add_test(NAME native-save COMMAND srw64-save-test)
    add_test(NAME native-touch-pad COMMAND srw64-touch-pad-test)
    add_test(NAME native-update COMMAND srw64-update-test)
endif()
set(SRW64_APP_JSON_INCLUDE_DIR "" CACHE PATH "Directory containing the pinned RT64 json/json.hpp")
if(SRW64_APP_JSON_INCLUDE_DIR)
    srw64_add_launch("${SRW64_APP_JSON_INCLUDE_DIR}")
    # The Switch's data from the player's ROM, made on a computer (tools/release/switch/prepare_data.py).
    add_executable(srw64-switch-prepare tools/release/switch/prepare_data.cpp src/native/app/console_data.cpp
                   src/native/localization/catalog.cpp)
    target_include_directories(srw64-switch-prepare PRIVATE "${SRW64_APP_JSON_INCLUDE_DIR}")
    # The release its data names (console_data.cpp), the same the console's program checks.
    set_property(SOURCE src/native/app/console_data.cpp APPEND PROPERTY COMPILE_DEFINITIONS "SRW64_VERSION=\"${PROJECT_VERSION}\"")
    target_link_libraries(srw64-switch-prepare PRIVATE srw64_launch)
    if(BUILD_TESTING)
        find_package(Python3 3.11 COMPONENTS Interpreter REQUIRED)
        add_executable(srw64-launch-test tests/native_launch.cpp)
        add_executable(srw64-import-probe tests/native_rom_import_probe.cpp)
        foreach(target srw64-launch-test srw64-import-probe)
            target_include_directories(${target} PRIVATE "${SRW64_APP_JSON_INCLUDE_DIR}")
            target_link_libraries(${target} PRIVATE srw64_launch)
            if(MSVC)
                target_compile_options(${target} PRIVATE /W4 /utf-8)
            endif()
        endforeach()
        add_test(NAME native-launch COMMAND srw64-launch-test)
        add_test(NAME native-import-oracle COMMAND "${Python3_EXECUTABLE}"
                 "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_native_import.py" --probe "$<TARGET_FILE:srw64-import-probe>")
    endif()
else()
    message(STATUS "Bootstrap/import tests require SRW64_APP_JSON_INCLUDE_DIR; base/codec tests remain enabled")
endif()

if(BUILD_TESTING)
    add_executable(srw64-desktop-test tests/native_desktop.cpp)
    target_link_libraries(srw64-desktop-test PRIVATE srw64_app)
    if(MSVC)
        target_compile_options(srw64-desktop-test PRIVATE /W4 /utf-8)
    else()
        target_compile_options(srw64-desktop-test PRIVATE -Wall -Wextra -Wpedantic)
    endif()
    add_test(NAME native-desktop COMMAND srw64-desktop-test)
    if(APPLE)
        enable_language(OBJCXX)
        add_subdirectory(tests/macos_bundle)
    endif()
endif()

if(BUILD_TESTING)
    add_executable(srw64-windows-portable-test tests/native_windows_portable.cpp)
    target_link_libraries(srw64-windows-portable-test PRIVATE srw64_app)
    if(MSVC)
        target_compile_options(srw64-windows-portable-test PRIVATE /W4 /utf-8)
        target_link_options(srw64-windows-portable-test PRIVATE /MANIFEST:EMBED
            "/MANIFESTINPUT:${CMAKE_CURRENT_SOURCE_DIR}/src/host/windows/marchwind64.manifest")
    else()
        target_compile_options(srw64-windows-portable-test PRIVATE -Wall -Wextra -Wpedantic)
    endif()
    add_test(NAME native-windows-portable COMMAND srw64-windows-portable-test)
    if(WIN32)
        find_package(Python3 3.11 COMPONENTS Interpreter REQUIRED)
        add_test(NAME windows-launcher-integration COMMAND "${Python3_EXECUTABLE}"
                 "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_windows_launcher.py"
                 --probe "$<TARGET_FILE:srw64-windows-portable-test>")
    endif()
endif()

if(BUILD_TESTING AND CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT ANDROID)
    add_executable(srw64-linux-portable-test tests/native_linux_portable.cpp)
    target_link_libraries(srw64-linux-portable-test PRIVATE srw64_app)
    target_compile_options(srw64-linux-portable-test PRIVATE -Wall -Wextra -Wpedantic)
    add_test(NAME native-linux-portable COMMAND srw64-linux-portable-test)
    find_package(Python3 3.11 COMPONENTS Interpreter QUIET)
    if(Python3_FOUND)
        add_test(NAME linux-launcher-integration COMMAND "${Python3_EXECUTABLE}"
                 "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_linux_launcher.py"
                 --probe "$<TARGET_FILE:srw64-linux-portable-test>")
    endif()
endif()
