cmake_minimum_required(VERSION 3.13)

option(BUILD_FOR_PICO "Build for Raspberry Pi Pico" ON)

set(GEOGRAPHICLIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/geographiclib)

# Configure GeographicLib before adding it, to skip docs/tools/tests
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(BUILD_DOCUMENTATION OFF CACHE BOOL "" FORCE)
set(BUILD_BOTH_LIBRARIES OFF CACHE BOOL "" FORCE)
set(PACKAGE_DEBIAN OFF CACHE BOOL "" FORCE)

# Automatically collect core sources and platform-specific HAL files
file(GLOB CORE_SOURCES CONFIGURE_DEPENDS "src/core/*.cpp" "src/core/*.c")
file(GLOB HAL_PICO_SOURCES CONFIGURE_DEPENDS "src/hal/*_pico.cpp")
file(GLOB HAL_LINUX_SOURCES CONFIGURE_DEPENDS "src/hal/*_linux.cpp")

if(BUILD_FOR_PICO)
    set(PICO_BOARD pico_w CACHE STRING "Board type")
    include(pico_sdk_import.cmake)
    project(p-rad C CXX ASM)

    set(CMAKE_CXX_STANDARD 23)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)

    pico_sdk_init()

    add_subdirectory(${GEOGRAPHICLIB_DIR} EXCLUDE_FROM_ALL)
    target_compile_options(GeographicLib INTERFACE -fexceptions -frtti)

    add_executable(p-rad
        src/main.cpp
        ${CORE_SOURCES}
        ${HAL_PICO_SOURCES}
    )

    target_compile_definitions(p-rad PRIVATE PICO_BUILD)
    target_include_directories(p-rad PRIVATE src)
    target_link_libraries(p-rad pico_stdlib pico_cyw43_arch_lwip_threadsafe_background hardware_rtc GeographicLib)

    pico_enable_stdio_usb(p-rad 1)
    pico_enable_stdio_uart(p-rad 0)

    pico_add_extra_outputs(p-rad)
else()
    project(p-rad CXX)

    set(CMAKE_CXX_STANDARD 23)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)

    add_subdirectory(${GEOGRAPHICLIB_DIR} EXCLUDE_FROM_ALL)

    add_executable(p-rad
        src/main.cpp
        ${CORE_SOURCES}
        ${HAL_LINUX_SOURCES}
    )

    target_include_directories(p-rad PRIVATE src)
    find_package(Threads REQUIRED)
    find_package(SDL3 REQUIRED CONFIG)
    find_package(CURL REQUIRED)
    target_link_libraries(p-rad Threads::Threads SDL3::SDL3 CURL::libcurl GeographicLib)
endif()