cmake_minimum_required(VERSION 3.20)
project(ThirdAgePC LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(THIRD_AGE_PORTABLE_RELEASE "Build compiler-free runtime with user-supplied assets" OFF)
option(THIRD_AGE_ALLOW_HEADLESS "Allow a build without a working SDL window" OFF)
if(NOT THIRD_AGE_ALLOW_HEADLESS)
    find_path(SDL2_INCLUDE_DIR NAMES SDL.h PATH_SUFFIXES SDL2)
    find_library(SDL2_LIBRARY NAMES SDL2)
    if(NOT SDL2_INCLUDE_DIR OR NOT SDL2_LIBRARY)
        message(FATAL_ERROR "SDL2 development headers and library are required for interactive play. For diagnostics only, set THIRD_AGE_ALLOW_HEADLESS=ON.")
    endif()
endif()
set(GBARECOMP_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/vendor/gbarecomp" CACHE PATH "Pinned framework checkout")
set(THIRD_AGE_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build/cartridge/generated" CACHE PATH "Generated cartridge sources")
set(GBARECOMP_GENERATED_BIOS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build/bios" CACHE PATH "Generated BIOS sources")
if(NOT THIRD_AGE_PORTABLE_RELEASE AND NOT EXISTS "${GBARECOMP_GENERATED_BIOS_DIR}/bios_recompiled.cpp")
    message(FATAL_ERROR "Generate the supplied BIOS first. See tools/build_runtime.sh.")
endif()
# Private assets stay outside versioned source; features are retained.
set(THIRD_AGE_PRIVATE_INCLUDE_DIR "" CACHE PATH "Local generated portrait/font headers (never distribute)")
if(NOT THIRD_AGE_PORTABLE_RELEASE)
foreach(private_header IN ITEMS third_age_portrait_patterns.private.inc third_age_ringbearer_data.h third_age_native_decode.private.inc)
    if(NOT EXISTS "${THIRD_AGE_PRIVATE_INCLUDE_DIR}/${private_header}")
        message(FATAL_ERROR "Missing private input ${private_header}; see docs/BUILD.md. No asset feature is silently disabled.")
    endif()
endforeach()
else()
    # Explicitly ignore any stale private build cache in portable configuration.
    set(GBARECOMP_GENERATED_BIOS_DIR "${CMAKE_CURRENT_BINARY_DIR}/no-generated-bios" CACHE PATH "No BIOS translations in portable release" FORCE)
endif()
add_subdirectory("${GBARECOMP_ROOT}" "${CMAKE_CURRENT_BINARY_DIR}/framework" EXCLUDE_FROM_ALL)
include("${CMAKE_CURRENT_BINARY_DIR}/framework/runtime.cmake")
if(THIRD_AGE_PORTABLE_RELEASE)
    if(EXISTS "${GBARECOMP_GENERATED_BIOS_DIR}/bios_recompiled.cpp")
        message(FATAL_ERROR "Portable build cannot contain generated BIOS sources")
    endif()
    target_compile_definitions(gbarecomp_runtime PUBLIC THIRD_AGE_PORTABLE_RELEASE=1)
    target_compile_definitions(gbarecomp_armv4t PRIVATE THIRD_AGE_PORTABLE_RELEASE=1)
    gbarecomp_add_runtime_target(third-age-pc GAME_GENERATED_C "${CMAKE_CURRENT_SOURCE_DIR}/src/empty_dispatch.cpp")
else()
    gbarecomp_add_runtime_target(third-age-pc GAME_GENERATED_DIR "${THIRD_AGE_GENERATED_DIR}")
endif()
target_sources(third-age-pc PRIVATE src/main.cpp)
if(THIRD_AGE_PORTABLE_RELEASE AND MINGW)
    target_link_options(third-age-pc PRIVATE -municode)
endif()

if(NOT THIRD_AGE_PORTABLE_RELEASE)
    target_include_directories(gbarecomp_runtime PRIVATE "${THIRD_AGE_PRIVATE_INCLUDE_DIR}")
endif()
gbarecomp_stage_mingw_runtime(third-age-pc)

option(THIRD_AGE_BUILD_PRESENTATION_TESTS "Build live SDL settings regression test" OFF)
if(THIRD_AGE_BUILD_PRESENTATION_TESTS)
    if(NOT THIRD_AGE_PORTABLE_RELEASE OR NOT SDL2_INCLUDE_DIR OR NOT SDL2_LIBRARY)
        message(FATAL_ERROR "Presentation tests require the portable release and SDL2")
    endif()
    enable_testing()
    gbarecomp_add_runtime_target(presentation-settings GAME_GENERATED_C "${CMAKE_CURRENT_SOURCE_DIR}/src/empty_dispatch.cpp")
    target_sources(presentation-settings PRIVATE tests/presentation-settings.cpp)
    target_include_directories(presentation-settings PRIVATE "${SDL2_INCLUDE_DIR}")
    if(MSVC)
        target_compile_options(presentation-settings PRIVATE /UNDEBUG)
    else()
        target_compile_options(presentation-settings PRIVATE -UNDEBUG)
    endif()
    add_test(NAME presentation-settings COMMAND presentation-settings "${CMAKE_CURRENT_BINARY_DIR}/presentation-test-results")
    set_tests_properties(presentation-settings PROPERTIES ENVIRONMENT
        "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy;SDL_RENDER_DRIVER=software;THIRD_AGE_PRESENT_HZ=0;THIRD_AGE_DITHER_OAM_CACHE=0")
endif()
