cmake_minimum_required(VERSION 3.20)

set(_UJL_DEFAULT_PSXRECOMP_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/psxrecomp")
if(NOT EXISTS "${_UJL_DEFAULT_PSXRECOMP_ROOT}/runtime/runtime.cmake"
   AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../psxrecomp/runtime/runtime.cmake")
    set(_UJL_DEFAULT_PSXRECOMP_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../psxrecomp")
endif()
set(PSXRECOMP_ROOT "${_UJL_DEFAULT_PSXRECOMP_ROOT}" CACHE PATH
    "Path to the pinned psxrecomp framework checkout")
unset(_UJL_DEFAULT_PSXRECOMP_ROOT)

if(NOT EXISTS "${PSXRECOMP_ROOT}/runtime/runtime.cmake")
    message(FATAL_ERROR
        "PSXRecomp runtime is missing: ${PSXRECOMP_ROOT}/runtime/runtime.cmake\n"
        "Use the sibling pinned checkout at ../psxrecomp or add psxrecomp as a "
        "root-level submodule before configuring.")
endif()

project(UmJamLamRecomp LANGUAGES C CXX)

set(PSX_SDL_BACKEND "SDL3" CACHE STRING
    "SDL backend for Um Jammer Lammy Recompiled" FORCE)

option(UJL_ENABLE_RECOMP_UI
    "Build the recomp-ui launcher/setup wizard when recomp-ui is available" ON)

set(_UJL_RECOMP_UI_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/recomp-ui")
if(RECOMP_UI_ROOT)
    set(_UJL_RECOMP_UI_ROOT "${RECOMP_UI_ROOT}")
endif()

set(_UJL_SETUP_HOST_ARGS)
if(UJL_ENABLE_RECOMP_UI AND EXISTS "${_UJL_RECOMP_UI_ROOT}/recomp_ui.cmake")
    set(RECOMP_UI_ROOT "${_UJL_RECOMP_UI_ROOT}" CACHE PATH
        "Path to recomp-ui launcher" FORCE)
    set(PSX_RECOMP_UI ON CACHE BOOL "Build recomp-ui launcher" FORCE)
    set(PSX_SETUP_WIZARD ON CACHE BOOL
        "Advertise first-run setup wizard + Generate & rebuild" FORCE)
    list(APPEND _UJL_SETUP_HOST_ARGS
        ENABLE_SETUP_WIZARD
        CODEGEN_SETUP_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/codegen_setup.c")
else()
    set(PSX_RECOMP_UI OFF CACHE BOOL
        "Build recomp-ui launcher; disabled until recomp-ui is present" FORCE)
    set(PSX_SETUP_WIZARD OFF CACHE BOOL
        "Setup wizard requires recomp-ui" FORCE)
    message(STATUS
        "UmJamLamRecomp: recomp-ui not found; configuring source-only runtime "
        "skeleton. Add recomp-ui/ or set RECOMP_UI_ROOT for setup-host builds.")
endif()
unset(_UJL_RECOMP_UI_ROOT)

set(PSX_NETPLAY OFF CACHE BOOL
    "Netplay remains off until Um Jammer Lammy runtime QA is complete" FORCE)

if(NOT EXISTS "${PSXRECOMP_ROOT}/lib/retcomm-rbengine/CMakeLists.txt")
    set(PSX_REWIND OFF CACHE BOOL
        "Hide Rewind until retcomm-rbengine is available" FORCE)
endif()

include("${PSXRECOMP_ROOT}/runtime/runtime.cmake")

set(UJL_PRELOADED_MODS "${CMAKE_CURRENT_SOURCE_DIR}/mods/preloaded")
if(NOT IS_DIRECTORY "${UJL_PRELOADED_MODS}")
    set(UJL_PRELOADED_MODS "NONE")
endif()

psxrecomp_add_game_runtime(psx-runtime
    PRELOADED_MODS_DIR "${UJL_PRELOADED_MODS}"
    WINDOW_TITLE "Um Jammer Lammy Recompiled"
    EXE_NAME "UmJammerLammy_Recompiled"
    DEFAULT_GAME_CONFIG_PATH "game.toml"
    MAX_PLAYERS 2
    APP_ICON "${CMAKE_CURRENT_SOURCE_DIR}/assets/psxrecomp.ico"
    GEN_MARKER "generated/SCES_017.53_dispatch.c"
    GEN_FULL_GLOB "generated/SCES_017.53_full_*.c"
    ${_UJL_SETUP_HOST_ARGS}
)

# Trusted, game-owned presentation plugin. It only selects the framework's
# verified native-wide renderer path; it does not patch guest code or memory.
target_sources(psx-runtime PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/src/ujl_widescreen.c"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/ujl_audio_cleanup.c")

foreach(_UJL_RUNTIME_CONFIG game.toml game_options.toml keybinds.ini)
    if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${_UJL_RUNTIME_CONFIG}")
        add_custom_command(TARGET psx-runtime POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
                "${CMAKE_CURRENT_SOURCE_DIR}/${_UJL_RUNTIME_CONFIG}"
                "$<TARGET_FILE_DIR:psx-runtime>/${_UJL_RUNTIME_CONFIG}"
            COMMENT "Staging ${_UJL_RUNTIME_CONFIG}"
            VERBATIM)
    endif()
endforeach()
