# Copyright(C) 2024  Sutou Kouhei <kou@clear-code.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

function(mrn_sphinx SOURCE_DIR LOCALE SOURCES HTML_FILES)
    set(ABSOLUT_SOURCES)
    set(ALL_SOURCES)
    foreach(SOURCE ${SOURCES} conf.py)
        list(APPEND ABSOLUTE_SOURCES ${SOURCE_DIR}/${SOURCE})
        list(APPEND ALL_ABSOLUTE_SOURCES ${SOURCE_DIR}/${SOURCE})
        if("${SOURCE}" STREQUAL "conf.py")
            # target
        elseif(NOT "${SOURCE}" MATCHES "\\.(rst|md)\$")
            continue()
        endif()
        string(REGEX REPLACE "\\.[^.]+\$" "" SOURCE_BASE_NAME ${SOURCE})
        set(POT "${LOCALE}/gettext/${SOURCE_BASE_NAME}.pot")
        set(PO
            "${SOURCE_DIR}/../locale/${LOCALE}/LC_MESSAGES/${SOURCE_BASE_NAME}.po"
        )
        set(PO_TIME_STAMP
            "${LOCALE}/LC_MESSAGES/${SOURCE_BASE_NAME}.po.time_stamp"
        )
        set(EDIT_PO "${LOCALE}/LC_MESSAGES/${SOURCE_BASE_NAME}.edit.po")
        add_custom_command(
            OUTPUT ${EDIT_PO}
            COMMAND
                ${RUBY} ${CMAKE_CURRENT_SOURCE_DIR}/../doc/update-edit-po.rb
                ${LOCALE} ${POT} ${PO} ${PO_TIME_STAMP} ${EDIT_PO}
            DEPENDS ${LOCALE}-gettext.time_stamp ${LOCALE}/gettext/conf.pot
        )
        add_custom_command(
            OUTPUT ${PO} ${PO_TIME_STAMP}
            COMMAND
                ${RUBY} ${CMAKE_CURRENT_SOURCE_DIR}/../doc/update-po.rb ${PO}
                ${PO_TIME_STAMP} ${EDIT_PO}
            DEPENDS ${EDIT_PO}
        )
        list(APPEND ALL_ABSOLUTE_SOURCES ${PO})
    endforeach()

    find_program(XGETTEXT xgettext REQUIRED)
    add_custom_command(
        OUTPUT ${LOCALE}/gettext/conf.pot
        COMMAND
            ${XGETTEXT} --language Python --output ${LOCALE}/gettext/conf.pot
            ${SOURCE_DIR}/conf.py
        DEPENDS ${SOURCE_DIR}/conf.py
    )

    find_program(SPHINX_BUILD sphinx-build REQUIRED)
    foreach(BUILDER "gettext" "html" "markdown")
        if("${BUILDER}" STREQUAL "gettext")
            set(TARGET_SOURCES ${ABSOLUTE_SOURCES})
        else()
            set(TARGET_SOURCES ${ALL_ABSOLUTE_SOURCES})
        endif()
        set(OUTPUTS
            ${LOCALE}/doctrees/${BUILDER}
            ${LOCALE}-${BUILDER}.time_stamp
        )
        if("${BUILDER}" STREQUAL "html")
            list(APPEND OUTPUTS ${HTML_FILES})
        endif()
        add_custom_command(
            OUTPUT ${OUTPUTS}
            COMMAND
                ${CMAKE_COMMAND} -E env DOCUMENT_VERSION=${MRN_VERSION_FULL}
                DOCUMENT_VERSION_FULL=${MRN_VERSION_FULL} LOCALE=${LOCALE}
                PACKAGE_MROONGA_VERSION=${MRN_VERSION_FULL} ${SPHINX_BUILD}
                $<$<CONFIG:Debug>:--fail-on-warning> --quiet -j auto -D
                language=${LOCALE} -b ${BUILDER} -d
                ${LOCALE}/doctrees/${BUILDER} ${SOURCE_DIR} ${LOCALE}/${BUILDER}
            COMMAND ${CMAKE_COMMAND} -E touch ${LOCALE}-${BUILDER}.time_stamp
            DEPENDS ${TARGET_SOURCES}
        )
        if("${BUILDER}" STREQUAL "html")
            add_custom_target(doc_${LOCALE}_${BUILDER} ALL DEPENDS ${OUTPUTS})
        else()
            add_custom_target(doc_${LOCALE}_${BUILDER} DEPENDS ${OUTPUTS})
        endif()
    endforeach()
endfunction()

include(${CMAKE_CURRENT_SOURCE_DIR}/files.cmake)

set(MRN_DOC_PRE_BUILD_STAMP "${CMAKE_CURRENT_SOURCE_DIR}/build-stamp")
set(MRN_DOC_LOCALES en ja)
foreach(LOCALE ${MRN_DOC_LOCALES})
    set(MRN_DOC_HTML_FILES_LOCALE)
    foreach(file ${MRN_DOC_HTML_FILES})
        list(
            APPEND MRN_DOC_HTML_FILES_LOCALE
            ${CMAKE_CURRENT_BINARY_DIR}/${LOCALE}/html/${file}
        )
    endforeach()
    if(EXISTS "${MRN_DOC_PRE_BUILD_STAMP}")
        install(
            DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/locale/${LOCALE}/html/
            COMPONENT Document
            DESTINATION ${CMAKE_INSTALL_DOCDIR}/${LOCALE}
            PATTERN ".buildinfo" EXCLUDE
        )
    else()
        mrn_sphinx(${CMAKE_CURRENT_SOURCE_DIR}/source ${LOCALE}
                   "${MRN_DOC_SOURCES}" "${MRN_DOC_HTML_FILES_LOCALE}"
        )
        install(
            DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${LOCALE}/html/
            COMPONENT Document
            DESTINATION ${CMAKE_INSTALL_DOCDIR}/${LOCALE}
            PATTERN ".buildinfo" EXCLUDE
        )
    endif()
endforeach()

add_custom_target(
    doc_update_files
    COMMAND ${RUBY} ${CMAKE_CURRENT_SOURCE_DIR}/update-files.rb
    DEPENDS doc_en_html
)

set(MRN_DOC_DEPLOY_DEPENDS)
foreach(LOCALE ${MRN_DOC_LOCALES})
    list(APPEND MRN_DOC_DEPLOY_DEPENDS doc_${LOCALE}_html)
endforeach()
add_custom_target(
    doc_deploy
    COMMAND ${RUBY} ${CMAKE_CURRENT_SOURCE_DIR}/deploy.rb
    DEPENDS ${MRN_DOC_DEPLOY_DEPENDS}
    VERBATIM
)
