BareGit
cmake_minimum_required(VERSION 3.24)
project(AgentSmith)

set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS FALSE)

include(FetchContent)

FetchContent_Declare(
  libmw
  GIT_REPOSITORY https://github.com/MetroWind/libmw.git
)

FetchContent_Declare(
  spdlog
  GIT_REPOSITORY https://github.com/gabime/spdlog.git
  GIT_TAG v1.12.0
)

FetchContent_Declare(
  json
  GIT_REPOSITORY https://github.com/nlohmann/json.git
  GIT_TAG v3.11.3
)

FetchContent_Declare(
  cxxopts
  GIT_REPOSITORY https://github.com/jarro2783/cxxopts.git
  GIT_TAG v3.1.1
)

set(SPDLOG_USE_STD_FORMAT ON)
set(LIBMW_BUILD_URL ON)
set(LIBMW_BUILD_SQLITE ON)
set(LIBMW_BUILD_HTTP_SERVER OFF)
set(LIBMW_BUILD_CRYPTO OFF)

FetchContent_MakeAvailable(libmw spdlog json cxxopts)

set(LIB_SOURCE_FILES
    src/agent.cpp
    src/llm_client.cpp
    src/memory.cpp
    src/tool.cpp
    src/message.cpp
)

set(LIBS
    mw::mw
    mw::url
    mw::sqlite
    spdlog::spdlog
    nlohmann_json::nlohmann_json
)

set(INCLUDES
    ${libmw_SOURCE_DIR}/includes
    ${json_SOURCE_DIR}/single_include
)

# 1. Build the Agent Smith Library
add_library(agent_smith ${LIB_SOURCE_FILES})
set_property(TARGET agent_smith PROPERTY CXX_STANDARD 23)
target_compile_options(agent_smith PRIVATE -Wall -Wextra)
target_include_directories(agent_smith PUBLIC ${INCLUDES} src)
target_link_libraries(agent_smith PUBLIC ${LIBS})

# 2. Build the Example CLI Executable
add_executable(agent_smith_cli src/main.cpp)
set_property(TARGET agent_smith_cli PROPERTY CXX_STANDARD 23)
target_compile_options(agent_smith_cli PRIVATE -Wall -Wextra)
target_include_directories(agent_smith_cli PRIVATE ${cxxopts_SOURCE_DIR}/include)
target_link_libraries(agent_smith_cli PRIVATE agent_smith cxxopts::cxxopts)

option(AGENT_SMITH_BUILD_TESTS "Build unit tests" ON)

if(AGENT_SMITH_BUILD_TESTS)
  FetchContent_Declare(
    googletest
    URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz
  )
  FetchContent_MakeAvailable(googletest)

  set(TEST_FILES
    src/task_test.cpp
    src/memory_test.cpp
    src/tool_test.cpp
    src/agent_test.cpp
    src/llm_client_test.cpp
    src/message_test.cpp
  )

  add_executable(agent_smith_test ${TEST_FILES})
  
  set_property(TARGET agent_smith_test PROPERTY CXX_STANDARD 23)
  target_compile_options(agent_smith_test PRIVATE -Wall -Wextra)
  target_include_directories(agent_smith_test PRIVATE 
    ${googletest_SOURCE_DIR}/googletest/include
    ${googletest_SOURCE_DIR}/googlemock/include
  )

  target_link_libraries(agent_smith_test PRIVATE
    agent_smith
    GTest::gtest_main
    GTest::gmock_main
  )

  enable_testing()
  include(GoogleTest)
  gtest_discover_tests(agent_smith_test)
endif()