cmake_minimum_required(VERSION 3.25)

project(voicecat
    VERSION 0.0.1
    DESCRIPTION "Self-hosted native voice & text chat (see docs/)"
    # C is needed for the vendored RNNoise noise-suppression lib (third_party/rnnoise).
    LANGUAGES CXX C)

# On iOS, audio_engine.cpp includes miniaudio.h which pulls in AVFoundation Objective-C
# headers. Those cannot be compiled as C++; we set audio_engine.cpp's LANGUAGE to OBJCXX
# in core/CMakeLists.txt, but that requires the language to be enabled first.
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
    enable_language(OBJCXX)
endif()

# ── Options ───────────────────────────────────────────────────────────────────
# The M0 skeleton compiles with NO third-party dependencies: every subsystem is a
# stub that returns VC_ERR_NOT_IMPLEMENTED. As each subsystem is built out, flip
# VOICECAT_USE_VCPKG_DEPS=ON so CMake pulls the real libraries (mbedTLS, libsodium,
# opus, protobuf, ...) via the vcpkg toolchain (see vcpkg.json / docs/tech-stack.md).
option(VOICECAT_USE_VCPKG_DEPS "Link real third-party deps via vcpkg" OFF)
option(VOICECAT_BUILD_SERVER   "Build voicecat-server"                ON)
option(VOICECAT_BUILD_TOOLS    "Build the vccli headless test client" ON)
option(VOICECAT_BUILD_TESTS    "Build tests"                          ON)
option(VOICECAT_BUILD_SHARED   "Build libvoicecat as a shared library" OFF)

# ── Global settings ───────────────────────────────────────────────────────────
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
endif()

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# ── Targets ───────────────────────────────────────────────────────────────────
add_subdirectory(core)

if(VOICECAT_BUILD_SERVER)
    add_subdirectory(server)
endif()

if(VOICECAT_BUILD_TOOLS)
    add_subdirectory(tools/vccli)
    if(VOICECAT_USE_VCPKG_DEPS)
        add_subdirectory(tools/voicecat-admin)
    endif()
endif()

if(VOICECAT_BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()

message(STATUS "VoiceCat ${PROJECT_VERSION} configured "
        "(vcpkg deps: ${VOICECAT_USE_VCPKG_DEPS}, "
        "server: ${VOICECAT_BUILD_SERVER}, tools: ${VOICECAT_BUILD_TOOLS})")
