# ------------------------------------------------------------------------------
# MADlib Documentation
# ------------------------------------------------------------------------------

set(DOXYGEN_README_FILE "../README.md" CACHE STRING
    "Path to ReadMe file relative to the doc directory after installation")
set(DOXYGEN_LICENSE_DIR "../../licenses" CACHE STRING
    "Path to license directory relative to the doc directory after installation")
configure_file(
    mainpage.dox.in
    "${CMAKE_CURRENT_BINARY_DIR}/mainpage.dox"
    @ONLY
)
configure_file(
    etc/DoxygenLayout.xml
    "${CMAKE_CURRENT_BINARY_DIR}/etc/DoxygenLayout.xml"
    @ONLY
)
configure_file(
    etc/header.html
    "${CMAKE_CURRENT_BINARY_DIR}/etc/header.html"
    @ONLY
)
configure_file(
    etc/madlib_extra.css
    "${CMAKE_CURRENT_BINARY_DIR}/etc/madlib_extra.css"
    @ONLY
)
file(
    COPY
    imgs/madlib.png
    DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/imgs"
)

file(
    DOWNLOAD
    "https://raw.githubusercontent.com/madlib/eigen/branches/3.2/doc/eigen_navtree_hacks.js"
    "${CMAKE_CURRENT_BINARY_DIR}/etc/eigen_navtree_hacks.js"
)

set(_DOXYGEN_INPUT_USER
    "\"${CMAKE_CURRENT_BINARY_DIR}/mainpage.dox\""
    "\"${CMAKE_SOURCE_DIR}/src/dbal\""
    "\"${CMAKE_SOURCE_DIR}/src/modules\""
    "\"${CMAKE_SOURCE_DIR}/src/ports\""
    "\"${CMAKE_SOURCE_DIR}/src/utils\""
    "\"${CMAKE_SOURCE_DIR}/methods\""
)
join_strings(DOXYGEN_INPUT_USER " " "${_DOXYGEN_INPUT_USER}")

set(_DOXYGEN_INPUT_DEVELOPER
    "\"${CMAKE_SOURCE_DIR}/src/ports/postgres/dbconnector/main.cpp\""
    ${_DOXYGEN_INPUT_USER}
)
join_strings(DOXYGEN_INPUT_DEVELOPER " " "${_DOXYGEN_INPUT_DEVELOPER}")

if(NOT DEFINED DOXYGEN_USE_MATHJAX)
    set(DOXYGEN_USE_MATHJAX YES CACHE BOOL
        "In user documentation, render LaTeX formulas using MathJax")
endif(NOT DEFINED DOXYGEN_USE_MATHJAX)

if(DOXYGEN_USE_MATHJAX)
    if(NOT DEFINED MATHJAX_DIR)
        find_path(MATHJAX_DIR
            NAMES MathJax.js
            PATHS "$ENV{MATHJAX_DIR}" "/usr/share/javascript/mathjax/"
            DOC "Path to local MathJax.js")
    endif(NOT DEFINED MATHJAX_DIR)
    if(MATHJAX_DIR)
        set(MATHJAX_RELPATH_CONFIG "MATHJAX_RELPATH = ${MATHJAX_DIR}")
        message(STATUS "Using local MathJax: " ${MATHJAX_DIR})
    else(MATHJAX_DIR)
        set(MATHJAX_RELPATH_CONFIG "")
        message(STATUS "Using default web-based MathJax")
    endif(MATHJAX_DIR)
endif(DOXYGEN_USE_MATHJAX)

# set(MATHJAX_INSTALLATION "${CMAKE_BINARY_DIR}/third_party/downloads/mathjax" CACHE PATH
#     "Path to MathJax installation (used to clone MathJax repository; absolute or relative to \${CMAKE_BINARY_DIR}/doc)"
# )
# set(DOXYGEN_MATHJAX_RELPATH "${CMAKE_BINARY_DIR}/third_party/downloads/mathjax" CACHE STRING
#     "Path to MathJax installation (used by Doxygen; absolute or relative to \${DOXYGEN_HTML_OUTPUT})"
# )

set(DOXYGEN_INCLUDE_PATH "\"${CMAKE_SOURCE_DIR}/src\" \"${CMAKE_SOURCE_DIR}/src/ports/postgres\"")

# Note: Type PATH implies that the value is either a relative path to
# ${CMAKE_CURRENT_BINARY_DIR} (and CMake generates the full path) or as an
# absolute path. Therefore, paths not relative to ${CMAKE_CURRENT_BINARY_DIR}
# must be of type STRING!
set(DOXYGEN_OUTPUT_DEVELOPER "${CMAKE_CURRENT_BINARY_DIR}/developer" CACHE PATH
    "Base path where the documentation generated by Doxygen will be put (abolsute or relative to \${CMAKE_BINARY_DIR}/doc/etc)"
)
set(DOXYGEN_OUTPUT_USER "${CMAKE_CURRENT_BINARY_DIR}/user" CACHE PATH
    "Base path where the documentation generated by Doxygen will be put (abolsute or relative to \${CMAKE_BINARY_DIR}/doc/etc)"
)
set(DOXYGEN_HTML_OUTPUT html CACHE STRING
    "Path (relative to \${DOXYGEN_OUTPUT_<config>} where HTML docs will be put."
)

# -- Set macros for SQL/Python files -------------------------------------------

set(PORT_UC "DOXYGEN")
set(DBMS "doxygen")
set(DBMS_UC "${PORT_UC}")
set(${DBMS_UC}_VERSION_STRING "0.0.0")
set(${DBMS_UC}_VERSION_MAJOR "0")
set(${DBMS_UC}_VERSION_MINOR "0")
set(${DBMS_UC}_VERSION_PATCH "0")
set(${DBMS_UC}_ARCHITECTURE "all")
set(DBMS_FEATURES "__HAS_ORDERED_AGGREGATES__")
define_m4_macros(M4_DEFINES_CMD_LINE M4_DEFINES_CODE ${DBMS_FEATURES})


# -- Build doxysql (the SQL parser) using flex and bison -----------------------

find_package(FLEX 2.5.33)
find_package(BISON 2.4)
find_package(Doxygen)

if(FLEX_FOUND AND BISON_FOUND AND DOXYGEN_FOUND)
    # The FindFLEX module by cmake unfortunately does not cover the
    # case when FlexLexer.h is in a non-standard location.
    get_dir_name(_FLEX_BASE "${FLEX_EXECUTABLE}")
    get_dir_name(_FLEX_BASE "${_FLEX_BASE}")
    find_path(_FLEX_INCLUDE_DIR
        NAMES "FlexLexer.h"
        HINTS "${_FLEX_BASE}/include"
    )
    if(_FLEX_INCLUDE_DIR)
        include_directories(BEFORE "${_FLEX_INCLUDE_DIR}")
    endif(_FLEX_INCLUDE_DIR)

    BISON_TARGET(doxysqlParser src/sql.yy ${CMAKE_CURRENT_BINARY_DIR}/sql.parser.cc)
    FLEX_TARGET(doxysqlScanner src/sql.ll ${CMAKE_CURRENT_BINARY_DIR}/sql.scanner.cc)
    ADD_FLEX_BISON_DEPENDENCY(doxysqlScanner doxysqlParser)

    include_directories(${CMAKE_CURRENT_BINARY_DIR})
    add_executable(doxysql ${BISON_doxysqlParser_OUTPUTS}
        ${FLEX_doxysqlScanner_OUTPUTS})
    set_target_properties(doxysql PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")


# -- Copy executable and configuration files -----------------------------------

    add_subdirectory(bin)
    add_subdirectory(etc)



# -- Update MathJax ------------------------------------------------------------
# NOTE: Below has been disabled since Mathjax CDN is used to obtain the
# appropriate files

# add_custom_target(update_mathjax
#     COMMAND bin/update_mathjax.sh
#     WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
# )
# if(DOXYGEN_USE_MATHJAX)
#     set(_MATHJAX_DEPENDENCY_USER update_mathjax)
# endif(DOXYGEN_USE_MATHJAX)


# -- Run doxygen ---------------------------------------------------------------

    set(_DOXYGEN_UNNEEDED_WARNINGS_FILTER egrep -v
        "warning:.*\\(@param is not found in the argument list.*kwargs\\)\$|The following parameters.*kwargs\\) are not documented\\)|parameter 'kwargs'\$")

    # Doxygen 1.7.5 does not accept absolute or relative paths for
    # CITE_BIB_FILES (this is a bug). We therefore need to copy all bib files
    # into "${CMAKE_BINARY_DIR}/doc/etc".
    add_custom_command(
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/etc/literature.bib"
        COMMAND ${CMAKE_COMMAND} -E copy
            "${CMAKE_SOURCE_DIR}/doc/literature.bib"
            "${CMAKE_CURRENT_BINARY_DIR}/etc/literature.bib"
        COMMENT "Copying bibliography into doxygen configuration directory."
    )

    add_custom_target(doc
        COMMAND ${DOXYGEN_EXECUTABLE} user.doxyfile | ${_DOXYGEN_UNNEEDED_WARNINGS_FILTER}
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/etc"
        DEPENDS doxysql
            "${CMAKE_CURRENT_BINARY_DIR}/etc/literature.bib"
        COMMENT "Generating user-level documentation..."
        VERBATIM
    )

    add_custom_target(devdoc
        COMMAND ${DOXYGEN_EXECUTABLE} developer.doxyfile | ${_DOXYGEN_UNNEEDED_WARNINGS_FILTER}
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/etc"
        DEPENDS doxysql
            "${CMAKE_CURRENT_BINARY_DIR}/etc/literature.bib"
        COMMENT "Generating developer documentation..."
        VERBATIM
    )

    # Copy any javascript file that is applied to the html files generated by doxygen
    add_custom_command(TARGET doc POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
            "${CMAKE_CURRENT_BINARY_DIR}/etc/eigen_navtree_hacks.js"
            "${DOXYGEN_OUTPUT_USER}/${DOXYGEN_HTML_OUTPUT}"
    )

    # Copy any javascript file that is applied to the html files generated by doxygen
    add_custom_command(TARGET devdoc POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
            "${CMAKE_CURRENT_BINARY_DIR}/etc/eigen_navtree_hacks.js"
            "${DOXYGEN_OUTPUT_DEVELOPER}/${DOXYGEN_HTML_OUTPUT}"
    )

# -- Install doc/user/html output directory to doc/html ------------------------

    # We specify OPTIONAL, which means it will not be an error if the user
    # documentation does not exist
    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/user/html
        DESTINATION doc
        OPTIONAL
        COMPONENT doc
        PATTERN ".DS_Store" EXCLUDE
    )


# -- Notify user if we could not run doxygen

else(FLEX_FOUND AND BISON_FOUND AND DOXYGEN_FOUND)
    message(STATUS "Could not find recent versions of at least one of flex, "
        "bison, doxygen, or dot (part of graphviz, needed for doxygen). "
        "Documentation will not be built.")
endif(FLEX_FOUND AND BISON_FOUND AND DOXYGEN_FOUND)

# -- Add subdirectories --------------------------------------------------------

add_subdirectory(design)
