#
#

if(NOT ROCPROFILER_BUILD_DOCS)
    return()
endif()

set(PACKAGE_NAME ${PROJECT_NAME})

include(FetchContent)

if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.24)
    cmake_policy(SET CMP0135 NEW)
endif()

set(DOCS_WD ${CMAKE_CURRENT_BINARY_DIR})
set(CONDA_ROOT ${PROJECT_BINARY_DIR}/external/miniconda)

find_program(SHELL_CMD NAMES bash sh REQUIRED)
find_program(CHMOD_CMD NAMES chmod)

if(NOT EXISTS ${PROJECT_BINARY_DIR}/external/miniconda.sh)
    message(
        STATUS
            "Downloading https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh"
        )
    file(
        DOWNLOAD
        https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
        ${PROJECT_BINARY_DIR}/external/miniconda.sh
        STATUS MINICONDA_DOWNLOAD_RET
        INACTIVITY_TIMEOUT 60
        SHOW_PROGRESS)

    if(NOT MINICONDA_DOWNLOAD_RET EQUAL 0)
        message(
            FATAL_ERROR
                "Download to ${PROJECT_BINARY_DIR}/external/miniconda.sh from https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh failed"
            )
    endif()
endif()

function(DOCS_EXECUTE_PROCESS)
    string(REPLACE ";" " " _MSG "${ARGN}")
    message(STATUS "[rocprofiler][docs] Executing: ${_MSG}")

    execute_process(
        COMMAND ${CMAKE_COMMAND} -E env HOME=${DOCS_WD} ${ARGN}
        RESULT_VARIABLE _RET
        OUTPUT_VARIABLE _OUT
        ERROR_VARIABLE _ERR
        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/external)

    if(NOT _RET EQUAL 0)
        message(STATUS "docs command failed: ${_RET}")
        message(STATUS "stderr:\n${_ERR}")
        message(STATUS "stdout:\n${_OUT}")
        string(REPLACE ";" " " _CMD "${ARGN}")
        message(FATAL_ERROR "command failure: ${_CMD}")
    endif()
endfunction()

include(ProcessorCount)
processorcount(ROCP_NUM_PROCS)
if(NOT ROCP_NUM_PROCS EQUAL 0)
    set(DOCS_BUILD_JOBS -j${ROCP_NUM_PROCS})
    message(STATUS "Using ${ROCP_NUM_PROCS} jobs for docs build")
endif()

file(
    WRITE "${CMAKE_CURRENT_BINARY_DIR}/build-docs.sh"
    "#!${SHELL_CMD}

set -e
set -x

HOME=${DOCS_WD}
export HOME

env

if [ ! -d '${CONDA_ROOT}' ]; then
    chmod +x ${PROJECT_BINARY_DIR}/external/miniconda.sh
    ${PROJECT_BINARY_DIR}/external/miniconda.sh -b -p ${CONDA_ROOT}
fi

PATH=${PROJECT_BINARY_DIR}/external/miniconda/bin:\${PATH}
export PATH

source ${CONDA_ROOT}/bin/activate

conda config --set always_yes yes
conda update -n base conda

if [ ! -d '${CONDA_ROOT}/envs/rocprofiler-docs' ]; then
    ${CONDA_ROOT}/bin/conda env create -n rocprofiler-docs -f ${CMAKE_CURRENT_LIST_DIR}/environment.yml
fi

which python

conda activate rocprofiler-docs

which python

python -m pip install -r ${CMAKE_CURRENT_LIST_DIR}/sphinx/requirements.txt

WORK_DIR=${PROJECT_SOURCE_DIR}/source/docs
SOURCE_DIR=${PROJECT_SOURCE_DIR}

cd \${SOURCE_DIR}

cmake -B build-docs \${SOURCE_DIR} -DROCPROFILER_INTERNAL_BUILD_DOCS=ON

cd \${WORK_DIR}

cmake -DSOURCE_DIR=\${SOURCE_DIR} -P \${WORK_DIR}/generate-doxyfile.cmake

mkdir -p _doxygen/rocprofiler-sdk
mkdir -p _doxygen/roctx

doxygen rocprofiler-sdk.dox
doxygen rocprofiler-sdk-roctx.dox

doxysphinx build \${WORK_DIR} \${WORK_DIR}/_build/html \${WORK_DIR}/_doxygen/rocprofiler-sdk/html
doxysphinx build \${WORK_DIR} \${WORK_DIR}/_build/html \${WORK_DIR}/_doxygen/roctx/html

make html SPHINXOPTS=\"--keep-going -n -q -T ${DOCS_BUILD_JOBS}\"

rm -rf ${PROJECT_SOURCE_DIR}/build-docs
")

if(CHMOD_CMD)
    docs_execute_process(${CHMOD_CMD} +x ${CMAKE_CURRENT_BINARY_DIR}/build-docs.sh)
    add_custom_target(docs ${CMAKE_COMMAND} -E env HOME=${DOCS_WD}
                           ${CMAKE_CURRENT_BINARY_DIR}/build-docs.sh)
else()
    add_custom_target(docs ${CMAKE_COMMAND} -E env HOME=${DOCS_WD} ${SHELL_CMD}
                           ${CMAKE_CURRENT_BINARY_DIR}/build-docs.sh)
endif()

install(
    DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_build/html/
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/html/${PACKAGE_NAME}
    COMPONENT docs
    OPTIONAL USE_SOURCE_PERMISSIONS FILES_MATCHING
    PATTERN "*")
