# Velox Download Manager — top-level build. Owned by lane PKG/QA.
#
# Lanes land in parallel and merge to main independently, so every add_subdirectory()
# here is guarded by EXISTS on the lane's own CMakeLists.txt: main always configures,
# and a lane's targets light up the moment that lane merges — no coordinated edit here.
#
#   cmake --preset dev && cmake --build --preset dev
#   ctest --preset dev

cmake_minimum_required(VERSION 3.28)

project(velox
    VERSION 0.1.0
    DESCRIPTION "IDM-class download manager for Linux"
    LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
endif()

option(VELOX_BUILD_GUI    "Build the Qt 6 GUI client"              ON)
option(VELOX_BUILD_TESTS  "Build unit and integration tests"      ON)
option(VELOX_BUILD_FUZZ   "Build libFuzzer targets (clang only)"  OFF)
option(VELOX_ENABLE_MEDIA "Build the HLS/DASH media grabber (M4)" OFF)
option(VELOX_WERROR       "Treat warnings as errors"              ON)

# Project-wide warning flags. Set via add_compile_options (a directory property), not the
# CMAKE_CXX_FLAGS cache variable, because the dev/tsan presets overwrite that cache var
# wholesale for sanitizer flags — a target's warnings must not ride on it.
add_compile_options(-Wall -Wextra -Wpedantic)
if(VELOX_WERROR)
    add_compile_options(-Werror)
endif()

if(VELOX_BUILD_FUZZ AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    message(WARNING "VELOX_BUILD_FUZZ is ON but the compiler is ${CMAKE_CXX_COMPILER_ID}; "
                    "libFuzzer needs Clang. Fuzz targets will be skipped.")
endif()

# --- Dependencies -------------------------------------------------------------------
# Found once here so a missing -dev package fails at configure with a clear name, rather
# than deep in a lane. Each find is gated on the lane that needs it being present.
find_package(Threads REQUIRED)

if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/core/CMakeLists.txt)
    find_package(CURL 8.0 REQUIRED)
    find_package(OpenSSL REQUIRED)
endif()

if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/daemon/CMakeLists.txt)
    find_package(SQLite3 REQUIRED)
    find_package(nlohmann_json 3.11 REQUIRED)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(LIBSECRET REQUIRED IMPORTED_TARGET libsecret-1)
endif()

if(VELOX_BUILD_GUI AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gui/CMakeLists.txt)
    find_package(Qt6 6.6 REQUIRED COMPONENTS Widgets Svg Network LinguistTools)
    qt_standard_project_setup()
endif()

if(VELOX_ENABLE_MEDIA)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET
        libavformat libavcodec libavutil)
endif()

# --- Tests --------------------------------------------------------------------------
if(VELOX_BUILD_TESTS)
    enable_testing()
endif()

# --- Lane targets (guarded; see header) -------------------------------------------
foreach(lane IN ITEMS core daemon cli nmhost)
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${lane}/CMakeLists.txt)
        add_subdirectory(${lane})
    else()
        message(STATUS "velox: lane '${lane}' has not landed a CMakeLists yet — skipping.")
    endif()
endforeach()

if(VELOX_BUILD_GUI)
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gui/CMakeLists.txt)
        add_subdirectory(gui)
    else()
        message(STATUS "velox: lane 'gui' has not landed a CMakeLists yet — skipping.")
    endif()
endif()

foreach(toolset tools/testserver tools/bench tools/fuzz tools/mockd)
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${toolset}/CMakeLists.txt)
        add_subdirectory(${toolset})
    endif()
endforeach()

if(VELOX_BUILD_TESTS)
    foreach(suite tests/conformance tests/integration tests/e2e)
        if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${suite}/CMakeLists.txt)
            add_subdirectory(${suite})
        endif()
    endforeach()
endif()
