cmake_minimum_required(VERSION 3.14)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(essim
  LANGUAGES CXX
  VERSION 0.1
  DESCRIPTION "System digital twin."
)

include(FetchContent)

set(FTXUI_BUILD_DOCS OFF CACHE INTERNAL "")
set(FTXUI_BUILD_EXAMPLES OFF CACHE INTERNAL "")
set(FTXUI_BUILD_TESTS OFF CACHE INTERNAL "")
set(FTXUI_ENABLE_INSTALL OFF CACHE INTERNAL "")

FetchContent_Declare(ftxui
  GIT_REPOSITORY https://github.com/ArthurSonzogni/FTXUI.git
  GIT_TAG v6.1.9
  GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(ftxui)

find_package(libzip REQUIRED)
find_package(pugixml REQUIRED)

# Library target = everything except main.cpp; reused by `essim` and `essim_tests`.
file(GLOB_RECURSE LIB_SOURCES "src/*.cpp")
list(REMOVE_ITEM LIB_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp")

add_library(essim_lib STATIC ${LIB_SOURCES})
target_include_directories(essim_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(essim_lib
  PUBLIC
    ftxui::screen
    ftxui::dom
    ftxui::component
    libzip::zip
    pugixml::pugixml
)

add_executable(essim src/main.cpp)
target_link_libraries(essim PRIVATE essim_lib)

# Tests
include(CTest)
if(BUILD_TESTING)
  set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
  FetchContent_Declare(doctest
    GIT_REPOSITORY https://github.com/doctest/doctest.git
    GIT_TAG v2.4.11
    GIT_SHALLOW TRUE
  )
  FetchContent_MakeAvailable(doctest)
  unset(CMAKE_POLICY_VERSION_MINIMUM)

  file(GLOB TEST_SOURCES "tests/*.cpp")
  if(TEST_SOURCES)
    add_executable(essim_tests ${TEST_SOURCES})
    target_link_libraries(essim_tests PRIVATE essim_lib doctest::doctest)
    add_test(NAME essim_tests COMMAND essim_tests)
  endif()
endif()

# Documentation: Doxygen → XML → custom Python script → doc/api/ (Markdown rendered by gitea).
# Optional — `doc` target is only created if Doxygen and Python 3 are present.
find_package(Doxygen COMPONENTS doxygen)
find_package(Python3 COMPONENTS Interpreter)

if(DOXYGEN_FOUND AND Python3_Interpreter_FOUND)
  set(DOXYGEN_OUTPUT_DIR "${CMAKE_BINARY_DIR}/doc")
  file(MAKE_DIRECTORY "${DOXYGEN_OUTPUT_DIR}")
  configure_file(
    "${CMAKE_SOURCE_DIR}/doc/Doxyfile.in"
    "${DOXYGEN_OUTPUT_DIR}/Doxyfile"
    @ONLY)

  set(DOC_API_DIR "${CMAKE_SOURCE_DIR}/doc/api")
  set(DOC_USER_DIR "${CMAKE_SOURCE_DIR}/doc/user")
  add_custom_target(doc
    DEPENDS essim
    COMMAND ${CMAKE_COMMAND} -E rm -rf "${DOC_API_DIR}"
    COMMAND ${CMAKE_COMMAND} -E make_directory "${DOC_API_DIR}/classes"
    COMMAND ${CMAKE_COMMAND} -E make_directory "${DOC_API_DIR}/files"
    COMMAND ${CMAKE_COMMAND} -E make_directory "${DOC_USER_DIR}"
    COMMAND ${DOXYGEN_EXECUTABLE} "${DOXYGEN_OUTPUT_DIR}/Doxyfile"
    COMMAND ${Python3_EXECUTABLE}
            "${CMAKE_SOURCE_DIR}/doc/gen_api_md.py"
            "${DOXYGEN_OUTPUT_DIR}/xml"
            "${DOC_API_DIR}"
    COMMAND $<TARGET_FILE:essim> --commands-md "${DOC_USER_DIR}/commands.md"
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    COMMENT "Generating documentation (doxygen → gen_api_md.py → doc/api/, essim --commands-md → doc/user/commands.md)"
    VERBATIM)
elseif(NOT DOXYGEN_FOUND AND NOT Python3_Interpreter_FOUND)
  message(STATUS "doc: Doxygen and Python 3 not found — `doc` target disabled.")
elseif(NOT DOXYGEN_FOUND)
  message(STATUS "doc: Doxygen not found — `doc` target disabled "
                 "(install via `pacman -S doxygen`).")
else()
  message(STATUS "doc: Python 3 interpreter not found — `doc` target disabled.")
endif()
