# =============================================================================
# RunAnywhere Server Module
# =============================================================================
# OpenAI-compatible HTTP server for LLM inference
#
# This module provides:
#   - GET  /v1/models           - List available models
#   - POST /v1/chat/completions - Chat completion (streaming & non-streaming)
#   - GET  /health              - Health check
#
# Dependencies (fetched by parent CMakeLists.txt):
#   - cpp-httplib (header-only HTTP library)
#   - nlohmann_json (header-only JSON library)
# =============================================================================

# Server implementation sources
set(RAC_SERVER_SOURCES
    http_server.cpp
    openai_handler.cpp
    openai_translation.cpp
    json_utils.cpp
)

set(RAC_SERVER_HEADERS
    http_server.h
    openai_handler.h
    openai_translation.h
    json_utils.h
)

# Create the server library
add_library(rac_server STATIC ${RAC_SERVER_SOURCES} ${RAC_SERVER_HEADERS})

# Include directories
target_include_directories(rac_server PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include>
    $<INSTALL_INTERFACE:include>
)

target_include_directories(rac_server PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/..
    ${CMAKE_CURRENT_SOURCE_DIR}/../generated/proto
    ${Protobuf_INCLUDE_DIRS}
)

if(RAC_PROTOBUF_NAMESPACE_ISOLATED)
    target_compile_definitions(rac_server PRIVATE google=runanywhere_internal)
endif()

# Link dependencies
target_link_libraries(rac_server PUBLIC
    rac_commons
    httplib::httplib
    nlohmann_json::nlohmann_json
)

# rac_server directly includes generated Protobuf C++ message headers. Link the
# runtime target privately so its Abseil/utf8-range usage requirements reach
# every clean compiler invocation instead of relying on host include paths.
if(TARGET protobuf::libprotobuf)
    target_link_libraries(rac_server PRIVATE protobuf::libprotobuf)
elseif(Protobuf_LIBRARIES)
    target_link_libraries(rac_server PRIVATE ${Protobuf_LIBRARIES})
else()
    message(FATAL_ERROR "rac_server requires the Protobuf C++ runtime target")
endif()

# Threading support
find_package(Threads REQUIRED)
target_link_libraries(rac_server PUBLIC Threads::Threads)

# Platform-specific libraries
if(UNIX AND NOT APPLE)
    # Linux needs explicit pthread
    target_link_libraries(rac_server PUBLIC pthread)
endif()

# Compiler options
target_compile_features(rac_server PUBLIC cxx_std_20)

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
    target_compile_options(rac_server PRIVATE -Wall -Wextra -Wpedantic)
endif()

if(MSVC)
    target_compile_options(rac_server PRIVATE
        "/FI${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/win_msvc_compat.h")
endif()

# Symbol visibility
set_target_properties(rac_server PROPERTIES
    C_VISIBILITY_PRESET hidden
    CXX_VISIBILITY_PRESET hidden
    VISIBILITY_INLINES_HIDDEN ON
)

# Install
install(TARGETS rac_server
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)

message(STATUS "  Server module configured")
