cmake_minimum_required(VERSION 3.22)

# These variables have to be defined before running setup_project
set(PROJECT_NAME hpp-doc)
set(PROJECT_DESCRIPTION "Documentation for HPP")
set(PROJECT_URL https://humanoid-path-planner.github.io/hpp-doc/index.html)

option(USE_CORBA "Enable dependency to hpp-manipulation-corba" OFF)

find_package(jrl-cmakemodules QUIET CONFIG)
if(jrl-cmakemodules_FOUND)
    get_property(
        JRL_CMAKE_MODULES
        TARGET jrl-cmakemodules::jrl-cmakemodules
        PROPERTY INTERFACE_INCLUDE_DIRECTORIES
    )
    message(STATUS "JRL cmakemodules found on system at ${JRL_CMAKE_MODULES}")
else()
    message(STATUS "JRL cmakemodules not found. Let's fetch it.")
    include(FetchContent)
    FetchContent_Declare(
        "jrl-cmakemodules"
        GIT_REPOSITORY "https://github.com/jrl-umi3218/jrl-cmakemodules.git"
    )
    FetchContent_MakeAvailable("jrl-cmakemodules")
    FetchContent_GetProperties("jrl-cmakemodules" SOURCE_DIR JRL_CMAKE_MODULES)
endif()

include("${JRL_CMAKE_MODULES}/hpp.cmake")

compute_project_args(PROJECT_ARGS LANGUAGES CXX)
project(${PROJECT_NAME} ${PROJECT_ARGS})

find_package(doxygen)

# Arguments are: - (required) package name - (optional) git url - (optional)
# robotpkg name
macro(ADD_PKG pkg)
    set(OPT_ARGS ${ARGN})
    list(APPEND SETUP_DOC_PKG ${pkg})
    list(LENGTH OPT_ARGS N_OPT_ARGS)
    if(${N_OPT_ARGS} GREATER 0)
        list(GET OPT_ARGS 0 ${pkg}_giturl)
    endif(${N_OPT_ARGS} GREATER 0)
    if(${N_OPT_ARGS} GREATER 1)
        list(GET OPT_ARGS 1 ${pkg}_robotpkg_package)
    endif(${N_OPT_ARGS} GREATER 1)
endmacro(ADD_PKG)

macro(ADD_HPP_PKG pkg)
    add_pkg(${pkg} git+https://github.com:humanoid-path-planner/${pkg})
endmacro(ADD_HPP_PKG)

set(SETUP_DOC_PKG)

add_hpp_pkg(coal)
add_hpp_pkg(hpp-util)
add_hpp_pkg(hpp-statistics)
add_hpp_pkg(pinocchio)
add_hpp_pkg(hpp-pinocchio)
add_hpp_pkg(hpp-core)
add_hpp_pkg(hpp-constraints)
add_hpp_pkg(hpp-manipulation)
add_hpp_pkg(hpp-manipulation-urdf)
add_hpp_pkg(hpp-gepetto-viewer)
add_hpp_pkg(hpp-tutorial)
add_hpp_pkg(hpp-python)
add_hpp_pkg(hpp-exec)
if(USE_CORBA)
    add_hpp_pkg(hpp-corbaserver)
    add_hpp_pkg(hpp-manipulation-corba)
    add_hpp_pkg(gepetto-viewer)
    add_hpp_pkg(gepetto-viewer-corba)
endif()

foreach(PKG ${SETUP_DOC_PKG})
    add_project_dependency(${PKG})

    set(PREFIX "${PKG}")
    set(DOC_VAR "${PKG}")
    list(APPEND LOGGING_WATCHED_VARIABLES ${PREFIX}_FOUND)
    if(${PREFIX}_FOUND)
        if(DEFINED ${PREFIX}_DOXYGENDOCDIR)
            set(DOC_PREFIX ${${PREFIX}_DOXYGENDOCDIR})
        elseif(DEFINED ${PREFIX}_DOCDIR)
            set(DOC_PREFIX ${${PREFIX}_DOCDIR})
        else(DEFINED ${PREFIX}_DOCDIR)
            set(DOC_PREFIX ${${PREFIX}_PREFIX}/share/doc/${PKG}/doxygen-html)
        endif(DEFINED ${PREFIX}_DOXYGENDOCDIR)
        string(
            REPLACE ${CMAKE_INSTALL_PREFIX}/share/doc
            ../..
            DOC_PREFIX
            "${DOC_PREFIX}"
        )
        if(EXISTS ${DOC_PREFIX}/main.html)
            set(${DOC_VAR}_URL ${DOC_PREFIX}/main.html)
        else(EXISTS ${DOC_PREFIX}/main.html)
            set(${DOC_VAR}_URL ${DOC_PREFIX}/index.html)
        endif(EXISTS ${DOC_PREFIX}/main.html)
        set(${DOC_VAR}_LINK "<a href='${${DOC_VAR}_URL}'>${PKG}</a>")
    else(${PREFIX}_FOUND)
        set(PACKAGE_NAME ${PKG})
        set(DOC_PKG_NAME "hpp_doc_missing_${DOC_VAR}")
        set(${DOC_VAR}_LINK "\\ref ${DOC_PKG_NAME}")
        set(${DOC_VAR}_URL ${${DOC_VAR}_LINK})
        set(STEPS)
        if(DEFINED ${PKG}_giturl)
            set(STEPS
                "${STEPS}\\li get the source code through \\c git:
\\code git clone ${${PKG}_giturl} \\endcode
Then configure, compile and install the package.\n"
            )
        endif(DEFINED ${PKG}_giturl)
        if(DEFINED ${PKG}_robotpkg_package)
            set(STEPS
                "${STEPS}\\li install it through \\c robotpkg :
\\code
cd robotpkg/${${PKG}_robotpkg_package}
make update
\\endcode"
            )
        endif(DEFINED ${PKG}_robotpkg_package)
        configure_file(
            doc/missing.dox.in
            ${CMAKE_BINARY_DIR}/doc/${PKG}-missing.dox
            @ONLY
        )
    endif(${PREFIX}_FOUND)
    list(APPEND LOGGING_WATCHED_VARIABLES ${DOC_VAR}_URL ${DOC_VAR}_LINK)
endforeach(PKG ${SETUP_DOC_PKG})

config_files(doc/main.dox doc/doxygenLayout.xml)

add_custom_command(
    OUTPUT ${CMAKE_BINARY_DIR}/graphDep.dot
    COMMAND
        ${CMAKE_SOURCE_DIR}/scripts/packageDep --quiet --output
        ${CMAKE_BINARY_DIR}/graphDep.dot ${SETUP_DOC_PKG}
)
add_custom_target(generate-html ALL DEPENDS graphDep.dot)

install(
    FILES
        doc/index.html
        doc/jquery-3.7.1.min.js
        ${CMAKE_BINARY_DIR}/doc/main.dox
    DESTINATION ${CMAKE_INSTALL_DOCDIR}
)
install(DIRECTORY doc/figures DESTINATION ${CMAKE_INSTALL_DOCDIR})
if(NOT DEFINED INSTALL_DOCUMENTATION OR ${INSTALL_DOCUMENTATION})
    install(
        FILES ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen-xml/index.xml
        DESTINATION ${CMAKE_INSTALL_DOCDIR}/doxygen-html
    )
endif()
