cmake_minimum_required(VERSION 3.20)
project(hdk
  VERSION 0.0.1
  LANGUAGES CXX
  DESCRIPTION "holo development kit"
)

option(HDK_TESTS "Build HDK tests" OFF)
option(HDK_EXAMPLES "Build HDK examples" OFF)
option(HDK_INSTALL_EXAMPLES "Install HDK example binaries and assets" OFF)
option(HDK_COVERAGE "Enable HDK coverage instrumentation and reporting" OFF)
option(HDK_USE_SYSTEM_DEPS "Prefer system packages before FetchContent fallbacks" ON)
set(HDK_COVERAGE_FAIL_UNDER 90 CACHE STRING "Minimum line coverage percentage required by strict coverage target")
set(HDK_DOCTEST_MIN_VERSION "2.4.12" CACHE STRING "Minimum doctest version when resolving system packages")
set(HDK_GRID_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-grid version when resolving system packages")
set(HDK_SDL_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-sdl version when resolving system packages")
set(HDK_IS3R_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-is3r version when resolving system packages")
set(HDK_SDL3_MIN_VERSION "3.4.8" CACHE STRING "Minimum SDL3 version when resolving system packages")
set(HDK_GRID_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-grid.git" CACHE STRING "Git repository used to fetch hdk-grid when package resolution fails")
set(HDK_GRID_GIT_TAG "v${HDK_GRID_MIN_VERSION}" CACHE STRING "Git tag used to fetch hdk-grid fallback")
set(HDK_SDL_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-sdl.git" CACHE STRING "Git repository used to fetch hdk-sdl when package resolution fails")
set(HDK_SDL_GIT_TAG "v${HDK_SDL_MIN_VERSION}" CACHE STRING "Git tag used to fetch hdk-sdl fallback")
set(HDK_IS3R_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-is3r.git" CACHE STRING "Git repository used to fetch hdk-is3r when package resolution fails")
set(HDK_IS3R_GIT_TAG "v${HDK_IS3R_MIN_VERSION}" CACHE STRING "Git tag used to fetch hdk-is3r fallback")
set(HDK_ASSETS_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-assets version required by examples")
set(HDK_ASSETS_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-assets.git" CACHE STRING "Git repository used to fetch hdk-assets when package resolution fails")
set(HDK_INSTALL_ASSETSDIR "assets" CACHE STRING "Install-time subdirectory for shared HDK assets under CMAKE_INSTALL_PREFIX")
set(HDK_CMAKE_POLICY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake" CACHE PATH "Directory containing shared HDK CMake policy helpers")

if(HDK_TESTS)
  include(CTest)
  enable_testing()

  option(HDK_USE_SYSTEM_DOCTEST "Try system doctest before FetchContent fallback" ${HDK_USE_SYSTEM_DEPS})
  option(HDK_FETCH_DOCTEST_FALLBACK "Fetch doctest when a suitable system package is unavailable" ON)

  if(HDK_USE_SYSTEM_DOCTEST)
    find_package(doctest ${HDK_DOCTEST_MIN_VERSION} QUIET CONFIG)
    if(doctest_FOUND AND NOT TARGET doctest::doctest)
      if(TARGET doctest)
        add_library(doctest::doctest ALIAS doctest)
      else()
        set(doctest_FOUND FALSE)
      endif()
    endif()
  endif()

  if(NOT doctest_FOUND)
    if(NOT HDK_FETCH_DOCTEST_FALLBACK)
      message(FATAL_ERROR "doctest >= ${HDK_DOCTEST_MIN_VERSION} not found and HDK_FETCH_DOCTEST_FALLBACK=OFF")
    endif()

    include(FetchContent)
    FetchContent_Declare(
      doctest
      GIT_REPOSITORY https://github.com/doctest/doctest.git
      GIT_TAG v${HDK_DOCTEST_MIN_VERSION}
    )
    FetchContent_MakeAvailable(doctest)
  endif()
endif()

if(HDK_COVERAGE)
  if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
    message(WARNING "Coverage requested but compiler '${CMAKE_CXX_COMPILER_ID}' may not support --coverage.")
  endif()

  add_library(hdk-coverage-flags INTERFACE)
  target_compile_options(
    hdk-coverage-flags
    INTERFACE
      -O0
      -g
      --coverage
      -fno-inline
      -fno-inline-functions
      -fno-default-inline
      -fkeep-inline-functions
      -fkeep-static-functions
  )
  target_link_options(hdk-coverage-flags INTERFACE --coverage)
endif()

add_subdirectory(grid)
add_subdirectory(sdl)
add_subdirectory(is3r)
add_subdirectory(assets)
#add_subdirectory(hogl)

if(HDK_TESTS AND HDK_COVERAGE)
  find_program(HDK_GCOVR_EXECUTABLE gcovr)
  if(HDK_GCOVR_EXECUTABLE)
    add_custom_target(
      coverage
      COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
      COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/coverage
      COMMAND
        ${HDK_GCOVR_EXECUTABLE}
        --root ${CMAKE_SOURCE_DIR}
        --filter ${CMAKE_SOURCE_DIR}/grid/include
        --filter ${CMAKE_SOURCE_DIR}/sdl/include
        --exclude ${CMAKE_BINARY_DIR}/_deps
        --print-summary
        --fail-under-function ${HDK_COVERAGE_FAIL_UNDER}
        --html-details ${CMAKE_BINARY_DIR}/coverage/index.html
      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
      COMMENT "Run strict tests+coverage and generate report at ${CMAKE_BINARY_DIR}/coverage/index.html"
      VERBATIM
    )
  else()
    message(WARNING "gcovr not found; coverage target will not be available.")
  endif()
endif()

# Option: DOCUMENTATION
option(HDK_DOCS "Build documentation" OFF)
if(HDK_DOCS)
  # Doxygen
  find_package(Doxygen)
  if(DOXYGEN_FOUND)
    set(DOXYGEN_GENERATE_HTML YES)
    set(DOXYGEN_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs)
    set(DOXYGEN_STRIP_FROM_PATH ${CMAKE_CURRENT_SOURCE_DIR})
    set(DOXYGEN_EXTRACT_ALL YES)
    set(DOXYGEN_DIRECTORY_GRAPH YES)
    set(DOXYGEN_JAVADOC_BANNER YES)
    set(DOXYGEN_JAVADOC_AUTOBRIEF YES)
    set(DOXYGEN_DOT_IMAGE_FORMAT svg)
    set(DOXYGEN_INTERACTIVE_SVG YES)
    set(DOXYGEN_INTERNAL_DOCS YES)
    set(DOXYGEN_TIMESTAMP YES)
    set(DOXYGEN_RECURSIVE YES)
    set(DOXYGEN_TAB_SIZE 2)
    set(DOXYGEN_BUILTIN_STL_SUPPORT YES)
    set(DOXYGEN_HTML_DYNAMIC_SECTIONS YES)
    set(DOXYGEN_USE_MDFILE_AS_MAINPAGE INDEX.md)    
    set(DOXYGEN_GENERATE_TREEVIEW YES)
    set(DOXYGEN_FULL_SIDEBAR YES)
    set(DOXYGEN_QUIET YES)
    set(DOXYGEN_SOURCE_BROWSER YES) # https://www.doxygen.nl/manual/config.html#cfg_source_browser
    # https://www.doxygen.nl/manual/config.html#cfg_verbatim_headers
    set(DOXYGEN_VERBATIM_HEADERS YES)
    set(DOXYGEN_REFERENCED_BY_RELATION YES)
    set(DOXYGEN_REFERENCES_RELATION YES)
    doxygen_add_docs(docs
      ${CMAKE_CURRENT_SOURCE_DIR}/INDEX.md
      ${CMAKE_CURRENT_SOURCE_DIR}/grid/include/
      ${CMAKE_CURRENT_SOURCE_DIR}/grid/src/
      ${CMAKE_CURRENT_SOURCE_DIR}/grid/*.md
      ${CMAKE_CURRENT_SOURCE_DIR}/sdl/include/
      ${CMAKE_CURRENT_SOURCE_DIR}/sdl/examples/
      ${CMAKE_CURRENT_SOURCE_DIR}/sdl/src/
      ${CMAKE_CURRENT_SOURCE_DIR}/sdl/*.md
      
      #USE_STAMP_FILE
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
      COMMENT "Generate API")
  else()
    message(WARNING "Doxygen not found, API documentation will not be generated.")
  endif()
endif()
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/HDKPackaging.cmake)
