#!/usr/bin/env python3
import sys
import os.path
from io import StringIO

deps_only = sys.argv[1] == '--deps'

if deps_only:
    del sys.argv[1]

opened_files = []

def open_tracked(name, mode='r'):
    opened_files.append(name)
    try:
        return open(name, mode)
    except FileNotFoundError:
        if deps_only:
            return StringIO("")
        raise

output_file = sys.argv[2]
try:
    os.remove(output_file)
except FileNotFoundError:
    pass
temp_output_file = output_file + '.tmp'
file_path = os.path.abspath(__file__)
openpower_path = os.path.split(file_path)[0]
wiki_path = os.path.split(openpower_path)[0]


def recursive_inline(f, input_name, depth):
    assert depth < 10, "probably found an [[!inline <span class="error">Error: missing pages parameter</span>]]-loop"
    skip = False # found the pattern <!-- hide -->
    for line in f.readlines():
        # skip hide/show
        if skip:
            if line.startswith("<!-- show -->"):
                skip = False
            continue
        elif line.startswith("<!-- hide -->"):
            skip = True
            continue
        # fix separation in comparison table
        if input_name.endswith("comparison_table.tex") and \
            line.startswith("\begin{itemize}"):
            o.write(line)
            o.write("\\itemsep -0.3em\n")
            continue
        # find headings and create name-refs, including filename
        if line.startswith("#"):
            iname = input_name.split("/")
            if iname[0] == 'openpower': iname.pop(0)
            l = line.strip().split(" ")[1:3]
            l = map(lambda x: ''.join(filter(str.isalnum, x)), l)
            l = map(str.lower, l)
            l = filter(lambda x:x, l)
            l = list(dict.fromkeys(iname + list(l)))
            l = '_'.join(l)
            line = '%s <a name="%s"> </>\n' % (line.strip(), l)
        # find actual inlines
        if not line.startswith("[[!inline"):
            o.write(line)
            continue
        print(line.strip())
        # assume first thing is pagename
        line = line.split('"')
        fname = line[1]
        print(f"\tdepth={depth}: {fname}")
        if fname.endswith(".py"):
            if fname.startswith("gf_reference"):
                with open_tracked(
                        wiki_path + "/../nmigen-gf/" + fname) as inc:
                    recursive_inline(inc, fname, depth + 1)
            else:
                with open_tracked(wiki_path + "/" + fname) as inc:
                    recursive_inline(inc, fname, depth + 1)
        else:
            if fname.endswith(".mdwn"):
                with open_tracked(wiki_path + "/" + fname) as inc:
                    recursive_inline(inc, fname, depth + 1)
            elif fname.startswith('openpower/isatables'):
                pth = wiki_path + "/../openpower-isa/" + fname
                with open_tracked(pth) as inc:
                    recursive_inline(inc, fname, depth + 1)
            elif fname.startswith('openpower/isa'):
                pth = wiki_path + "/../openpower-isa/" + fname + ".mdwn"
                with open_tracked(pth) as inc:
                    recursive_inline(inc, fname, depth + 1)
            else:
                with open_tracked(wiki_path + "/" + fname + ".mdwn") as inc:
                    recursive_inline(inc, fname, depth + 1)


def body(o, print=print):
    with open_tracked(sys.argv[1], "r") as f:
        recursive_inline(f, sys.argv[1], 0)

if deps_only:
    with StringIO() as o:
        body(o, print=lambda *_: None)
    deps_file = output_file + '.d'
    with open(deps_file, "w") as o:
        deps = " ".join(opened_files)
        o.write(f"{output_file} {deps_file}: {deps}\n")
else:
    with open(temp_output_file, "w") as o:
        body(o)
    os.rename(temp_output_file, output_file)