#!/usr/bin/python3

import contextlib
from pathlib import Path
import os
import re
import sys

import mdgen

source = os.path.abspath(sys.argv[1]).replace(os.path.abspath(mdgen.repository), "")

def generate_code(text, out):
    print("```c++", file=out)
    text = text.replace("elided", "...")
    text = text.strip()
    print(text, file=out)
    print("```", file=out)


def generate_md(text, out):
    text = re.sub(r"^// ?", "", text, flags=re.MULTILINE)
    text = mdgen.replace_md(text, source=source)
    print(text, file=out)


action = {"MD": generate_md, "md": generate_md, "/***": generate_md, "CODE": generate_code, "code": generate_code, "//***": generate_code}

out_path = Path(sys.argv[2]).absolute()

with contextlib.suppress(FileNotFoundError):
    out_path.chmod(0o600)


def generate():
    with open(sys.argv[1]) as fh:
        input = fh.read()

    with open(out_path, "w") as out:
        fragments = re.findall(
            r"(/\*{3}(.*?)\*{3}/)|(//\*{3}(.*?)//\*{3})",
            re.sub(
                r"// etc<.*?// >.*?$", r"// etc", input, flags=re.MULTILINE | re.DOTALL
            ),
            flags=re.MULTILINE | re.DOTALL,
        )

        for i, fragment in enumerate(fragments):
            if fragment[1] != "":
                text = re.sub(r"^// ?", "", fragment[1], flags=re.MULTILINE)
                if i > 0:
                    text = mdgen.replace_links(text, source=source)
                else:
                    text = mdgen.replace_md(text, source=source)
                print(text, file=out)
            else:
                generate_code(fragment[3], out)

        if len(fragments) > 0:
            return

        fragments = re.findall(
            r"// (md|code)<(.*?)// > *",
            re.sub(
                r"// etc<.*?// >.*?$", r"// etc", input, flags=re.MULTILINE | re.DOTALL
            ),
            flags=re.MULTILINE | re.DOTALL,
        ) + re.findall(
            r"# *ifdef YOMM2_(MD|CODE)(.*?)# *endif",
            re.sub(
                r"// etc<.*?// >.*?$", r"// etc", input, flags=re.MULTILINE | re.DOTALL
            ),
            flags=re.MULTILINE | re.DOTALL,
        )

        for fragment in fragments:
            prefix, content = fragment
            action[prefix](content, out)


generate()
out_path.chmod(0o400)
