cmake_minimum_required(VERSION 3.25)
project(VCop3Native LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/Dependencies.cmake")
include("${CMAKE_CURRENT_SOURCE_DIR}/sdk/cmake/XbeRecomp.cmake")
enable_testing()
find_package(Python3 3.11 REQUIRED COMPONENTS Interpreter)
add_test(NAME VCop3ExtractionTests COMMAND "${Python3_EXECUTABLE}" -m unittest discover -s tests -v)
set_tests_properties(VCop3ExtractionTests PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/assets/vc3.xbe")
file(SHA256 "${CMAKE_CURRENT_SOURCE_DIR}/assets/vc3.xbe" actual_sha256)
if(NOT actual_sha256 STREQUAL "85fcc40d1653609d905906f15beb507057089d2be61eadc36fe369827580a7c8")
    message(FATAL_ERROR "vc3.xbe differs from the supported Chihiro executable")
endif()
file(GLOB XBE_HOST_SOURCES CONFIGURE_DEPENDS src/common/*.cpp)
add_xbe_image(VCop3 vc3.xbe game.toml 32 game)
target_compile_definitions(VCop3 PRIVATE VCOP3_SDL_INPUT=1)
set_target_properties(VCop3 PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
else()
    message(STATUS "Import the supported Chihiro .7z to build VCop3; tools and input tests remain available")
endif()
option(VCOP3_RENDERER_TESTS "Build the SDK Vulkan regression tests" OFF)
if(VCOP3_RENDERER_TESTS)
add_xbe_tests(VCop3RuntimeTests)
endif()
add_executable(VCop3MouseTests tests/mouse_gun.cpp)
target_include_directories(VCop3MouseTests PRIVATE src)
target_compile_options(VCop3MouseTests PRIVATE -UNDEBUG)
add_test(NAME VCop3MouseTests COMMAND VCop3MouseTests)
add_executable(VCop3MouseSDLTests tests/mouse_sdl.cpp src/game/mouse_sdl.cpp sdk/runtime/core/log.cpp)
target_include_directories(VCop3MouseSDLTests PRIVATE src sdk/runtime)
target_compile_definitions(VCop3MouseSDLTests PRIVATE VCOP3_SDL_INPUT=1)
target_compile_options(VCop3MouseSDLTests PRIVATE -UNDEBUG)
target_link_libraries(VCop3MouseSDLTests PRIVATE SDL3::SDL3)
add_test(NAME VCop3MouseSDLTests COMMAND VCop3MouseSDLTests)
add_executable(VCop3PlayersTests tests/players.cpp src/game/mouse_sdl.cpp
    sdk/runtime/core/input.cpp sdk/runtime/core/keyboard_pad.cpp sdk/runtime/core/log.cpp)
target_include_directories(VCop3PlayersTests PRIVATE src sdk/runtime)
target_compile_definitions(VCop3PlayersTests PRIVATE VCOP3_SDL_INPUT=1)
target_compile_options(VCop3PlayersTests PRIVATE -UNDEBUG)
target_link_libraries(VCop3PlayersTests PRIVATE SDL3::SDL3 tomlplusplus::tomlplusplus)
add_test(NAME VCop3MouseControllerTests COMMAND VCop3PlayersTests mouse-controller)
add_test(NAME VCop3TwoControllersTests COMMAND VCop3PlayersTests controllers)

if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/generated/game/image_symbols.h")
add_executable(VCop3ResourceTests tests/resources.cpp sdk/runtime/xdk/d3d8.cpp
    sdk/runtime/gpu/nv2a_texture.cpp sdk/runtime/gpu/texture.cpp sdk/runtime/gpu/vertex.cpp sdk/runtime/core/log.cpp)
target_include_directories(VCop3ResourceTests PRIVATE generated/game sdk/runtime sdk/runtime/platform/compat)
target_compile_options(VCop3ResourceTests PRIVATE -UNDEBUG -ffunction-sections -fdata-sections)
target_link_options(VCop3ResourceTests PRIVATE -Wl,--gc-sections)
add_test(NAME VCop3ResourceTests COMMAND VCop3ResourceTests)
endif()
