# libvoicecat — the shared C++ core (docs/architecture.md).
# Sources are globbed so adding a stub under src/<subsystem>/ needs no CMake edit.
file(GLOB_RECURSE VOICECAT_SOURCES CONFIGURE_DEPENDS
     "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")

if(VOICECAT_BUILD_SHARED)
    add_library(voicecat SHARED ${VOICECAT_SOURCES})
else()
    add_library(voicecat STATIC ${VOICECAT_SOURCES})
    # Static consumers must see VC_API as empty (no dllimport).
    target_compile_definitions(voicecat PUBLIC VOICECAT_STATIC)
endif()
add_library(voicecat::voicecat ALIAS voicecat)

target_include_directories(voicecat
    PUBLIC  ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)

target_compile_definitions(voicecat PRIVATE VOICECAT_BUILDING)
target_compile_features(voicecat PUBLIC cxx_std_20)

set_target_properties(voicecat PROPERTIES
    C_VISIBILITY_PRESET hidden
    CXX_VISIBILITY_PRESET hidden
    VISIBILITY_INLINES_HIDDEN ON)

if(VOICECAT_USE_VCPKG_DEPS)
    find_package(protobuf CONFIG REQUIRED)
    find_package(unofficial-sodium CONFIG REQUIRED)
    find_package(MbedTLS CONFIG REQUIRED)
    find_package(asio CONFIG REQUIRED)
    find_package(unofficial-sqlite3 CONFIG REQUIRED)
    find_package(spdlog CONFIG REQUIRED)
    find_package(Opus CONFIG REQUIRED)
    # miniaudio is header-only; vcpkg does not install a CMake config for it.
    find_path(MINIAUDIO_INCLUDE_DIR "miniaudio.h" REQUIRED)

    # Generate C++ from voicecat.proto into the build tree.
    protobuf_generate(
        TARGET voicecat
        PROTOS proto/voicecat.proto
        LANGUAGE cpp
        IMPORT_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/proto
        PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated/proto)
    # Generated .pb.h files are included by protocol/envelope.h (consumed by tests and server),
    # so the generated dir and protobuf itself must be PUBLIC.
    target_include_directories(voicecat PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/generated)

    target_link_libraries(voicecat
        PUBLIC  protobuf::libprotobuf
        PRIVATE unofficial-sodium::sodium
                MbedTLS::mbedtls MbedTLS::mbedcrypto MbedTLS::mbedx509
                asio::asio unofficial::sqlite3::sqlite3 spdlog::spdlog
                Opus::opus)

    target_include_directories(voicecat PRIVATE ${MINIAUDIO_INCLUDE_DIR})

    target_compile_definitions(voicecat PUBLIC VOICECAT_HAS_OPUS VOICECAT_HAS_AUDIO)

    if(WIN32)
        # AcceptEx / GetAcceptExSockaddrs live in mswsock; ws2_32 covers the base Winsock API.
        target_link_libraries(voicecat PRIVATE ws2_32 mswsock)
    endif()

    # Signal to C++ code that the real networking/crypto stack is available.
    target_compile_definitions(voicecat PUBLIC VOICECAT_HAS_NET)
endif()
