cmake_minimum_required(VERSION 3.20)
project(NXST
    LANGUAGES CXX
    VERSION 0.1.0
)

# ── C++ standard and flags ────────────────────────────────────────────────────
# Arch/linker/libnx flags are already injected by the Switch.cmake toolchain.
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)  # gnu++17

add_compile_options(
    -fno-rtti
    -fno-exceptions
    -O2
    -g
    -D_GNU_SOURCE=1
)

# Export compilation database (enables clangd / clang-tidy on the host)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# ── Sources ───────────────────────────────────────────────────────────────────
file(GLOB_RECURSE NXST_SOURCES
    src/app/*.cpp
    src/domain/*.cpp
    src/infra/net/*.cpp
    src/infra/fs/*.cpp
    src/infra/sys/*.cpp
    src/service/*.cpp
    src/ui/*.cpp
)

add_executable(NXST ${NXST_SOURCES})

# ── Include paths ─────────────────────────────────────────────────────────────
target_include_directories(NXST PRIVATE include)

# ── pkg-config (uses aarch64-none-elf-pkg-config set by Switch.cmake) ─────────
find_package(PkgConfig REQUIRED)

set(NXST_PKG_MODULES
    SDL2_ttf SDL2_gfx SDL2_image SDL2_mixer
    freetype2 harfbuzz minizip libpng libjpeg libwebp
    glesv2 egl glapi zlib
)
pkg_check_modules(PORTLIBS REQUIRED IMPORTED_TARGET ${NXST_PKG_MODULES})

target_include_directories(NXST PRIVATE ${PORTLIBS_INCLUDE_DIRS})

# ── Plutonium ─────────────────────────────────────────────────────────────────
include(ExternalProject)

set(PLUTONIUM_SOURCE_DIR ${CMAKE_BINARY_DIR}/plutonium)
set(LIBPU_A ${PLUTONIUM_SOURCE_DIR}/Plutonium/lib/libpu.a)

ExternalProject_Add(plutonium_ep
    GIT_REPOSITORY  https://github.com/XorTroll/Plutonium.git
    GIT_TAG         b56564b70d038c59eef875f2c3cf436859c827f2
    GIT_PROGRESS    ON
    SOURCE_DIR      ${PLUTONIUM_SOURCE_DIR}
    CONFIGURE_COMMAND ""
    BUILD_COMMAND   make -j -C ${PLUTONIUM_SOURCE_DIR}/Plutonium
    INSTALL_COMMAND ""
    BUILD_IN_SOURCE 1
    BUILD_BYPRODUCTS ${LIBPU_A}
)

add_library(plutonium STATIC IMPORTED GLOBAL)
add_dependencies(plutonium plutonium_ep)
set_target_properties(plutonium PROPERTIES
    IMPORTED_LOCATION ${LIBPU_A}
)
target_include_directories(NXST PRIVATE ${PLUTONIUM_SOURCE_DIR}/Plutonium/include)

# ── Link libraries ────────────────────────────────────────────────────────────
# Order matters for static linking: put most dependent libs first.
# drm_nouveau, harfbuzz, freetype, z appended explicitly after pkg-config output
# to fix the freetype→harfbuzz static link order (see build notes from libnx update).
target_link_libraries(NXST PRIVATE
    plutonium
    PkgConfig::PORTLIBS
    drm_nouveau
    harfbuzz
    freetype
    z
)

# ── NACP + NRO ────────────────────────────────────────────────────────────────
set(NXST_NACP ${CMAKE_CURRENT_BINARY_DIR}/NXST.nacp)

nx_generate_nacp(
    OUTPUT  ${NXST_NACP}
    NAME    "NXST"
    AUTHOR  "DragonSpirit"
    VERSION "04.26.2026"
)

nx_create_nro(NXST
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/NXST.nro
    ICON   ${CMAKE_SOURCE_DIR}/icon.png
    NACP   ${NXST_NACP}
)

# ── Convenience targets ────────────────────────────────────────────────────────
find_program(NXLINK_EXE nxlink HINTS ${DEVKITPRO}/tools/bin)

if(NXLINK_EXE)
    add_custom_target(send
        COMMAND ${NXLINK_EXE} ${CMAKE_CURRENT_BINARY_DIR}/NXST.nro
        DEPENDS NXST_nro
        COMMENT "Sending NXST.nro via nxlink"
    )

    add_custom_target(debug
        COMMAND ${NXLINK_EXE} -s ${CMAKE_CURRENT_BINARY_DIR}/NXST.nro
        DEPENDS NXST_nro
        COMMENT "Sending NXST.nro with stdio bridge"
    )
endif()
