FIND_PACKAGE(Doxygen 1.8.7)

INCLUDE(FeatureSummary)

IF(DOXYGEN_FOUND)
    OPTION(BUILD_DOCS "build documentation (requires Doxygen)" ON)
ELSE(DOXYGEN_FOUND)
    OPTION(BUILD_DOCS "build documentation (requires Doxygen)" OFF)
ENDIF(DOXYGEN_FOUND)

IF(BUILD_DOCS AND NOT DOXYGEN_FOUND)
    MESSAGE(FATAL_ERROR "build documentation selected, but Doxygen could not be found")
ENDIF()

IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/user_doc/html
   AND IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/share/man/man1)
    SET(HAVE_PREBUILT_DOCS TRUE)
ELSE()
    SET(HAVE_PREBUILT_DOCS FALSE)
ENDIF()

IF(BUILD_DOCS OR HAVE_PREBUILT_DOCS)
    SET(INSTALL_DOCS ON)
ELSE()
    SET(INSTALL_DOCS OFF)
ENDIF()

ADD_FEATURE_INFO(Documentation INSTALL_DOCS "user manual and documentation")

IF(BUILD_DOCS)
    # Files in ./share/completions/
    FILE(GLOB COMPLETIONS_DIR_FILES share/completions/*.fish)

    # Files in ./share/functions/
    FILE(GLOB FUNCTIONS_DIR_FILES share/functions/*.fish)

    # Files in doc_src
    FILE(GLOB DOC_SRC_FILES doc_src/*)

    # .txt files in doc_src
    FILE(GLOB HELP_SRC doc_src/*.txt)

    # These files are the source files, they contain a few @FOO@-style substitutions.
    # Note that this order defines the order that they appear in the documentation.
    SET(HDR_FILES_SRC doc_src/index.hdr.in doc_src/tutorial.hdr doc_src/design.hdr
                      doc_src/license.hdr doc_src/commands.hdr.in doc_src/faq.hdr)

    # These are the generated result files.
    STRING(REPLACE ".in" "" HDR_FILES "${HDR_FILES_SRC}")

    # Header files except for index.hdr
    SET(HDR_FILES_NO_INDEX ${HDR_FILES})
    LIST(REMOVE_ITEM HDR_FILES_NO_INDEX doc_src/index.hdr)

    # Copy doc_src files
    FILE(COPY ${DOC_SRC_FILES} DESTINATION doc_src)

    # Build lexicon_filter.
    ADD_CUSTOM_COMMAND(OUTPUT lexicon_filter
                       COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_lexicon_filter.sh
                                  ${CMAKE_CURRENT_SOURCE_DIR}/share/functions/
                                  ${CMAKE_CURRENT_SOURCE_DIR}/share/completions/
                                  ${CMAKE_CURRENT_SOURCE_DIR}/lexicon_filter.in
                                  ${SED}
                                  > ${CMAKE_CURRENT_BINARY_DIR}/lexicon_filter
                                    && chmod a+x ${CMAKE_CURRENT_BINARY_DIR}/lexicon_filter
                      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                      DEPENDS ${FUNCTIONS_DIR_FILES} ${COMPLETIONS_DIR_FILES}
                              doc_src/commands.hdr ${CMAKE_CURRENT_SOURCE_DIR}/lexicon_filter.in
                              share/functions/__fish_config_interactive.fish
                              build_tools/build_lexicon_filter.sh command_list_toc.txt)

    # Other targets should depend on this target, otherwise the lexicon
    # filter can be built twice.
    ADD_CUSTOM_TARGET(build_lexicon_filter DEPENDS lexicon_filter)

    #
    # commands.hdr collects documentation on all commands, functions and
    # builtins
    #
    FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc_src)
    ADD_CUSTOM_COMMAND(OUTPUT doc_src/commands.hdr command_list_toc.txt
                       WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                       COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_commands_hdr.sh ${HELP_SRC}
                                   < doc_src/commands.hdr.in
                                   > ${CMAKE_CURRENT_BINARY_DIR}/doc_src/commands.hdr
                       DEPENDS ${HELP_SRC}
                               ${CMAKE_CURRENT_SOURCE_DIR}/doc_src/commands.hdr.in
                               ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_commands_hdr.sh)

    # doc.h is a compilation of the various snippets of text used both for
    # the user documentation and for internal help functions into a single
    # file that can be parsed by Doxygen to generate the user
    # documentation.
    ADD_CUSTOM_COMMAND(OUTPUT doc.h
                       COMMAND cat ${HDR_FILES} > ${CMAKE_CURRENT_BINARY_DIR}/doc.h
                       DEPENDS ${HDR_FILES})

    # toc.txt: $(HDR_FILES:index.hdr=index.hdr.in) build_tools/build_toc_txt.sh | show-SED
    #   FISH_BUILD_VERSION=${FISH_BUILD_VERSION} build_tools/build_toc_txt.sh \
    #     $(HDR_FILES:index.hdr=index.hdr.in) > toc.txt
    # Note we would like to add doc_src/index.hdr.in as a dependency but CMake replaces this with
    # doc_src/index.hdr; CMake bug?
    ADD_CUSTOM_COMMAND(OUTPUT toc.txt
                       COMMAND env `cat ${FBVF} | tr -d '\"'` ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_toc_txt.sh
                               doc_src/index.hdr.in ${HDR_FILES_NO_INDEX}
                               > ${CMAKE_CURRENT_BINARY_DIR}/toc.txt
                       DEPENDS ${CFBVF} ${HDR_FILES_NO_INDEX})

    # doc_src/index.hdr: toc.txt doc_src/index.hdr.in | show-AWK
    # @echo "  AWK CAT  $(em)$@$(sgr0)"
    # $v cat $@.in | $(AWK) '{if ($$0 ~ /@toc@/){ system("cat toc.txt");} else{ print $$0;}}' >$@
    ADD_CUSTOM_COMMAND(OUTPUT doc_src/index.hdr
                       COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_index_hdr.sh toc.txt
                               < doc_src/index.hdr.in
                               > ${CMAKE_CURRENT_BINARY_DIR}/doc_src/index.hdr
                       DEPENDS toc.txt)

    # doc: $(HDR_FILES_SRC) Doxyfile.user $(HTML_SRC) $(HELP_SRC) doc.h $(HDR_FILES) lexicon_filter
    #   @echo "  doxygen  $(em)user_doc$(sgr0)"
    #   $v (cat Doxyfile.user; echo INPUT_FILTER=./lexicon_filter; echo PROJECT_NUMBER=$(FISH_BUILD_VERSION) | $(SED) "s/-.*//") | doxygen - && touch user_doc
    #   $v rm -f $(wildcard $(addprefix ./user_doc/html/,arrow*.png bc_s.png bdwn.png closed.png doc.png folder*.png ftv2*.png nav*.png open.png splitbar.png sync_*.png tab*.* doxygen.* dynsections.js jquery.js pages.html))
    ADD_CUSTOM_TARGET(doc ALL
                      COMMAND env `cat ${FBVF}`
                              ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_user_doc.sh
                              ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.user ./lexicon_filter
                      DEPENDS ${CFBVF} Doxyfile.user ${DOC_SRC_FILES} doc.h ${HDR_FILES} build_lexicon_filter command_list_toc.txt)

    ADD_CUSTOM_COMMAND(OUTPUT share/man/
                       COMMAND env `cat ${FBVF} | tr -d '\"' `
                               INPUT_FILTER=lexicon_filter ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_documentation.sh ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.help doc_src ./share
                       DEPENDS ${CFBVF} ${HELP_SRC} build_lexicon_filter)

    ADD_CUSTOM_TARGET(BUILD_MANUALS ALL DEPENDS share/man/)

    # Group docs targets into a DocsTargets folder
    SET_PROPERTY(TARGET doc BUILD_MANUALS build_lexicon_filter
                 PROPERTY FOLDER cmake/DocTargets)
ELSEIF(HAVE_PREBUILT_DOCS)
    IF(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
        # Out of tree build - link the prebuilt documentation to the build tree
        ADD_CUSTOM_TARGET(link_doc ALL)
        ADD_CUSTOM_COMMAND(TARGET link_doc
            COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/share/man ${CMAKE_CURRENT_BINARY_DIR}/share/man
            POST_BUILD)
        ADD_CUSTOM_COMMAND(TARGET link_doc
            COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/user_doc ${CMAKE_CURRENT_BINARY_DIR}/user_doc
            POST_BUILD)
    ENDIF()
ENDIF(BUILD_DOCS)