#!/usr/bin/env python3
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
"""mdbook preprocessor that adds an overview to linked header files.

This overview holds links to the generated doxygen api documentation
as well as the actual file.
"""
import io
import json
import re
import sys
from pathlib import Path, PurePath

from mdbook import difgen
from mdbook import utils as md_utils

SRCTREE_TOP = Path(__file__).parents[1].resolve()


def main() -> None:
    md_utils.supports_html_only()

    # load both the context and the book from stdin
    context, book = json.load(sys.stdin)
    book_root = Path(context["root"])

    try:
        site_url = PurePath(context["config"]["output"]["html"]["site-url"])
    except KeyError:
        site_url = PurePath("/")

    try:
        preproc_cfg = context["config"]["preprocessor"]["doxygen"]
        out_dir = SRCTREE_TOP / preproc_cfg["out-dir"]
        html_out_dir = "/" + preproc_cfg["html-out-dir"]
        dif_src_regex = re.compile(preproc_cfg["dif-src-py-regex"])
    except KeyError:
        sys.exit(
            "mdbook_doxygen.py requires are set in the book.toml configuration.\n"
            "\tpreprocessor.reggen.out-dir -- Doxygen's output directory.\n"
            "\tpreprocessor.reggen.html-out-dir -- Doxygen's html out directory.\n"
            "\tpreprocessor.reggen.dif-src-py-regex -- A regex for identifying dif files.\n"
        )

    combined_xml = difgen.get_combined_xml(out_dir / 'api-xml')

    header_files = set()
    for chapter in md_utils.chapters(book["sections"]):
        src_path = chapter["source_path"]
        if src_path is None or dif_src_regex.search(src_path) is None:
            continue

        file_name = Path(src_path).name

        # First calculate the path to the generated dif header,
        # relative to the root of the project. This is the form ingested
        # by the difgen library scripts.
        rel_dif_h = (book_root / src_path).relative_to(SRCTREE_TOP)

        buffer = io.StringIO()
        buffer.write(f"# {file_name}\n")
        difgen.gen_listing_html(html_out_dir, combined_xml, str(rel_dif_h),
                                buffer)
        buffer.write(
            "\n<details><summary>\nGenerated from <a href=\"{}\">{}</a></summary>\n"
            .format(
                site_url / src_path,
                file_name,
            ),
        )
        buffer.write("\n```c\n{}\n```\n".format(chapter["content"]))
        buffer.write("</details>")
        chapter["content"] = buffer.getvalue()

        # Rewrite path so `dif_*.h` files don't collide with `dif_*.md` files.
        if Path(chapter["path"]).suffix == ".h":
            chapter["path"] = str(Path(chapter["path"]).with_suffix(""))
        chapter["path"] = chapter["path"] + "_h.html"

        header_files.add(Path(src_path))

    for chapter in md_utils.chapters(book["sections"]):
        if chapter["source_path"] is None:
            continue
        page_path = Path(chapter["source_path"]).parent

        chapter["content"] = md_utils.change_link_ext(
            header_files,
            chapter["content"],
            "_h.html",
            book_root,
            page_path,
        )

    # dump the book into stdout
    print(json.dumps(book))


if __name__ == "__main__":
    main()
