#!/usr/bin/python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

from __future__ import print_function

from generate import *

import uuid
from xml.etree import ElementTree

def gen_broker_j_books(release, source_dir, output_dir):
    toplevel_pom = join(source_dir, "pom.xml")
    input_dir = join(source_dir, "doc")

    cpp_broker_book_url = "/releases/qpid-cpp-{{current_cpp_release}}/cpp-broker/book/"
    jms_client010_book_url = "/releases/qpid-jms-amqp-0-x-{{current_jms_amqp_0_x_release}}/jms-client-0-10/book/"

    call("mvn -f {} -pl doc -amd -Ddoc=true package -DqpidCppBook={} -DqpidJmsClient010Book={}",
         toplevel_pom,
         cpp_broker_book_url,
         jms_client010_book_url)

    java_broker_input_dir = join(input_dir, "java-broker", "target", "docbkx")
    java_broker_book_dir = join(output_dir, "book")

    remove(java_broker_book_dir)

    copy(java_broker_input_dir, java_broker_book_dir)

    for path in find(output_dir, "*.html"):
        print(path)

        tree = ElementTree.parse(path)
        elem = tree.find(".//{http://www.w3.org/1999/xhtml}body")

        elem.tag = "div"
        elem.set("class", "docbook")

        remove_namespace(elem, "http://www.w3.org/1999/xhtml")

        # A hack to preserve docbook's empty anchors in an
        # IE-compatible way

        target = str(uuid.uuid4())

        for a in tree.iter("a"):
            if a.text is None:
                a.text = target

        content = ElementTree.tostring(elem, encoding="unicode")
        content = content.replace(target, "")

        write("{}.in".format(path), content)
        remove(path)

# From http://homework.nwsnet.de/releases/45be/
def remove_namespace(doc, namespace):
    """Remove namespace in the passed document in place."""
    ns = u'{%s}' % namespace
    nsl = len(ns)
    for elem in doc.iter():
        if elem.tag.startswith(ns):
            old_tag=elem.tag
            elem.tag = elem.tag[nsl:] 

## Now do stuff ##

release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
source_dir = checkout_dir or fetch_source("broker-j", source_release)

gen_broker_j_books(release, source_dir, release_dir)

notice("Docs generated")
