# Copyright (C) 2009, 2016 Julian Andres Klode <jak@debian.org>.
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

function(add_docbook target sourcefiles installdest)
    foreach(file ${sourcefiles})
        get_filename_component(relfile ${file} NAME)
        string(REPLACE ".dbk" "" manual ${relfile})
        get_filename_component(absolute ${file} ABSOLUTE)

        add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${manual}.html/
            COMMAND xsltproc --nonet --novalid --xinclude
                             --stringparam base.dir ${CMAKE_CURRENT_BINARY_DIR}/${manual}.html/
                             --path ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/${CURRENT_VENDOR}/
                             --path ${CMAKE_CURRENT_SOURCE_DIR}/
                             ${CMAKE_CURRENT_SOURCE_DIR}/docbook-html-style.xsl
                             ${absolute}
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
            DEPENDS ${file}
        )
        set(commands ${commands} ${CMAKE_CURRENT_BINARY_DIR}/${manual}.html)
        if (NOT ${installdest} EQUAL "" )
        install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${manual}.html
            DESTINATION ${installdest})
        endif()
    endforeach(file ${sourcefiles})

    add_custom_target(${target} ALL DEPENDS ${commands})
endfunction()


function(add_po4a type master po target deps)
    add_custom_command(OUTPUT ${target}
        COMMAND po4a-translate --keep 0 -f ${type} -m ${master}
                               -p ${po} -l ${target}
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        DEPENDS ${deps} ${master} ${po})
endfunction()


# Macro for XML man pages.
function(add_xml_manpages target manpages translations entities)
    foreach(manpage ${manpages})
        string(LENGTH ${manpage} manpage_length)
        math(EXPR manpage_length ${manpage_length}-1)
        string(SUBSTRING ${manpage} ${manpage_length} 1 section)

        add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${manpage}
                COMMAND xsltproc --path ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/${CURRENT_VENDOR}/
                                 --path ${CMAKE_CURRENT_SOURCE_DIR}/
                                 ${CMAKE_CURRENT_SOURCE_DIR}/manpage-style.xsl
                                 ${CMAKE_CURRENT_SOURCE_DIR}/${manpage}.xml
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${manpage}.xml
            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/manpage-style.xsl
        )


        set(commands ${commands} ${CMAKE_CURRENT_BINARY_DIR}/${manpage})

        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${manpage}
                DESTINATION ${CMAKE_INSTALL_MANDIR}/man${section})

        # Add the translations for the manpage.
        foreach(translation ${translations})
            set(entities)
            # transdir = shortcut to the output directory for translations.
            set(transdir ${CMAKE_CURRENT_BINARY_DIR}/${translation})

            add_po4a(docbook ${manpage}.xml po/${translation}.po
                             ${transdir}/${manpage}.xml "${ent_cmds}")


            add_custom_command(OUTPUT ${transdir}/${manpage}
                COMMAND xsltproc --path ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/${CURRENT_VENDOR}/
                                 --path ${CMAKE_CURRENT_SOURCE_DIR}/
                                 --stringparam l10n.gentext.default.language ${translation}
                                 ${CMAKE_CURRENT_SOURCE_DIR}/manpage-style.xsl
                                 ${transdir}/${manpage}.xml
                WORKING_DIRECTORY ${transdir}
                DEPENDS ${transdir}/${manpage}.xml
                DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/manpage-style.xsl)

            set(nls-cmd ${nls-cmd} ${transdir}/${manpage})
            install(FILES ${transdir}/${manpage}
                    DESTINATION ${CMAKE_INSTALL_MANDIR}/${translation}/man${section})

        endforeach(translation ${translations})
    endforeach(manpage ${manpages})

    add_custom_target(${target} ALL DEPENDS ${commands})
    # Sort the list of the translations.
    list(SORT nls-cmd)
    add_custom_target(nls-${target} ALL DEPENDS ${nls-cmd})
endfunction()


function(add_manpages target manpages translations)
    foreach(man ${manpages})
        string(LENGTH ${man} manpage_length)
        math(EXPR manpage_length ${manpage_length}-1)
        string(SUBSTRING ${man} ${manpage_length} 1 section)
        install(FILES ${man} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${section})

        if (USE_NLS)
            foreach(translation ${translations})
                set(transdir ${CMAKE_CURRENT_BINARY_DIR}/${translation})
                add_po4a(man ${man} po/${translation}.po ${transdir}/${man} "")
                install(FILES ${transdir}/${man}
                        DESTINATION ${CMAKE_INSTALL_MANDIR}/${translation}/man${section})
                set(files ${files} ${transdir}/${man})
            endforeach(translation ${translations})
        endif()
    endforeach(man ${manpages})
    add_custom_target(${target} ALL DEPENDS ${files})
endfunction()