cmake_minimum_required(VERSION 3.10)
set(PROJECT_NAME "FServer")
project(${PROJECT_NAME})

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fsanitize=address")

# Add Address Sanitizer flags if available
find_library(ASAN_LIBRARY asan)
if (ASAN_LIBRARY)
    message(STATUS "Address Sanitizer found: ${ASAN_LIBRARY}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
else()
    message(WARNING "Address Sanitizer not found. Proceeding without ASAN.")
endif()

find_package (glog REQUIRED)

# Include the nlohmann/json library
find_package(nlohmann_json REQUIRED)

include_directories(${CMAKE_SOURCE_DIR}/src)
include_directories(${CMAKE_SOURCE_DIR}/plugins)

# Add external libraries
add_subdirectory(external/tser)

include_directories(${CMAKE_SOURCE_DIR}/external/tser/include)


# Set the output directories for executables and libraries
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/plugins)

# Main server executable
add_executable(${PROJECT_NAME}
    src/main.cpp
    src/Server.cpp
    src/IPC.cpp
    src/Config.cpp
)

# Link libraries
target_link_libraries(${PROJECT_NAME} nlohmann_json::nlohmann_json glog::glog)

# Add the plugins subdirectories
add_subdirectory(${CMAKE_SOURCE_DIR}/src/plugins/SamplePlugin)
add_subdirectory(${CMAKE_SOURCE_DIR}/src/plugins/TcpServerPlugin)
add_subdirectory(${CMAKE_SOURCE_DIR}/src/plugins/DatabasePlugin)
