set(DOCS_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}")

set(DOCS_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/nsys-exporter_docs.tar.gz")
set(DOCS_BUILDDIR "${CMAKE_CURRENT_BINARY_DIR}/docsbuild")
set(DOCS_PICKLES "${CMAKE_CURRENT_BINARY_DIR}/pickles")


set(DOCS
    "conf.py"
    "custom.css"
    "examples.rst"
    "exported_data.rst"
    "index.rst"
    "json_text_format.rst"
    "overview.rst"
    "composite.report32.results.txt"
    "composite.report32.sql"
    "cuda_kernel_api.report32.sql"
    "cuda_kernel_api.report32.results.txt"
    "fecs.gpuctxsw.sql"
    "fecs.gpuctxsw.results.txt"
    "fps_histogram.dx12.sql"
    "fps_histogram.dx12.results.txt"
    "func_table.report32.sql"
    "func_table.report32.results.txt"
    "map.cunvtx.sql"
    "map.cunvtx.results.txt"
    "osrt.report32.sql"
    "osrt.report32.results.txt"
    "overhead.report32.sql"
    "overhead.report32.results.txt"
    "sched.report32.sql"
    "sched.report32.results.txt"
    "streams.report32.sql"
    "streams.report32.results.txt"
)

add_custom_command(
    OUTPUT "${DOCS_OUTPUT}"
    COMMAND "${CMAKE_COMMAND}" -E remove "${DOCS_OUTPUT}"
    COMMAND "${CMAKE_COMMAND}" -E remove_directory "${DOCS_BUILDDIR}"
    COMMAND "${PYTHON3_CMD}" -m sphinx -b html -E -q -W -d "${DOCS_PICKLES}"
        "${DOCS_LOCATION}" "${DOCS_BUILDDIR}"
    COMMAND "${CMAKE_COMMAND}" -E tar zcf "${DOCS_OUTPUT}" "${DOCS_BUILDDIR}"
    DEPENDS "${DOCS}"
    COMMENT "Building nsys-exporter documentation."
    VERBATIM
)

add_custom_target(QdrepExporter_BuildDocsArchive DEPENDS "${DOCS_OUTPUT}")
set_property(TARGET QdrepExporter_BuildDocsArchive PROPERTY LOCATION "${DOCS_OUTPUT}")

# Documentation examples testing.
get_property(QdrepExporter_Location TARGET QdrepExporter PROPERTY LOCATION)
AgoraGetDestinationPath(TEST_BIN "" QdrepExporter_TestsDir QdrepExporter_TestsSymDir)


function(QdrepExporter_GenerateDocTests TEST_REPORT RESULTS)
    get_filename_component(REPORT_NAME "${TEST_REPORT}" NAME_WE)
    set(SQL_DATABASE "${CMAKE_CURRENT_BINARY_DIR}/${REPORT_NAME}.sqlite")

    add_custom_command(
        OUTPUT "${SQL_DATABASE}"
        COMMAND "${CMAKE_COMMAND}" -E remove "${SQL_DATABASE}"
        COMMAND "${CMAKE_COMMAND}" -E env LD_LIBRARY_PATH=${QdrepExporter_TestsDir}
            "${QdrepExporter_Location}" -s "${TEST_REPORT}" "${SQL_DATABASE}"
        DEPENDS QdrepExporter "${TEST_REPORT}"
        COMMENT "Generating SQLite test database: ${REPORT_NAME}.sqlite"
    )

    foreach(DOC_FILE ${DOCS})
        if("${DOC_FILE}" MATCHES ".*[.]${REPORT_NAME}[.]sql$")
            get_filename_component(TESTCASE_NAME "${DOC_FILE}" NAME_WE)

            set(SQL_INPUT "${DOCS_LOCATION}/${DOC_FILE}")
            set(SQL_REFERENCE
                "${DOCS_LOCATION}/${TESTCASE_NAME}.${REPORT_NAME}.results.txt")
            set(SQL_OUTPUT
                "${CMAKE_CURRENT_BINARY_DIR}/${TESTCASE_NAME}.${REPORT_NAME}.results.new")
            set(SQL_TEMP_DATABASE
                "${SQL_DATABASE}_${TESTCASE_NAME}.sqlite")

            add_custom_command(
                OUTPUT "${SQL_OUTPUT}"
                COMMAND "${CMAKE_COMMAND}" -E copy_if_different
                    "${SQL_DATABASE}" "${SQL_TEMP_DATABASE}"
                COMMAND "${AGORA_SQLITE3_CMD}" -column -header -cmd ".output ${SQL_OUTPUT}"
                    "${SQL_TEMP_DATABASE}" ".read ${SQL_INPUT}"
                COMMAND "${CMAKE_COMMAND}" -E compare_files
                    "${SQL_OUTPUT}" "${SQL_REFERENCE}"
                DEPENDS "${SQL_INPUT}" "${SQL_REFERENCE}" "${SQL_DATABASE}"
                COMMENT "Checking nsys-exporter documentation part: '${SQL_INPUT}'."
                VERBATIM
            )

            # If the test above fails, e.g:
            #
            # Checking nsys-exporter documentation part: '/home/akostikov/agora/QuadD/Tools/QdrepExporter/Docs/streams.sql'.
            # FAILED:
            # ...
            # Files "/home/.../QuadD/Tools/QdrepExporter/Docs/streams.results.new" to
            # "/home/.../QuadD/Tools/QdrepExporter/Docs/streams.results.txt" are different.
            #
            # This means that the new output from example queries is different.
            # After verifying that the new data makes sense, fix with:
            #
            # cat streams.sql | sqlite3 -column -header report32.sqlite > streams.results.txt
            #

            list(APPEND RESULTS "${SQL_OUTPUT}")
        endif()
    endforeach(DOC_FILE ${DOCS})

    set(${RESULTS} ${${RESULTS}} PARENT_SCOPE)
endfunction()


set(TEST_REPORTS
    "report32.qdrep"
    "dx12.qdrep"
    "gpuctxsw.qdrep"
    "cunvtx.qdrep"
)

set(SQL_CHECK_RESULTS)

foreach(REPORT_FILE ${TEST_REPORTS})
    QdrepExporter_GenerateDocTests("${DOCS_LOCATION}/${REPORT_FILE}" SQL_CHECK_RESULTS)
endforeach()

if(NOT SQL_CHECK_RESULTS)
    message(SEND_ERROR "No SQL example queries to check have been found.")
endif(NOT SQL_CHECK_RESULTS)

add_custom_target(QdrepExporter_CheckDocs DEPENDS ${SQL_CHECK_RESULTS})

add_dependencies(quadd QdrepExporter_CheckDocs)
# Reduce possible surprise build failures. Don't allow documentation to build
# without testing examples first.
add_dependencies(QdrepExporter_BuildDocsArchive QdrepExporter_CheckDocs)
