#!/usr/bin/env python

import os, pathlib, sys


def generate(private, public):
    return f'{{ include: [ "{private}", "private", "<{public}>", "public" ] }}'


def panic(file):
    print(f"========== {__file__} error ==========", file=sys.stderr)
    print(
        f"\tFile '{file}' is a top-level detail header without a mapping",
        file=sys.stderr,
    )
    sys.exit(1)


def generate_map(include):
    detail_files = []
    detail_directories = []
    c_headers = []

    for i in include.iterdir():
        if i.is_dir() and i.name.startswith("__"):
            detail_directories.append(f"{i.name}")
            continue

        if i.name.startswith("__"):
            detail_files.append(i.name)
            continue

        if i.name.endswith(".h"):
            c_headers.append(i.name)

    result = []
    temporary_mappings = {"__locale_dir": "locale"}
    for i in detail_directories:
        public_header = temporary_mappings.get(i, i.lstrip("_"))
        result.append(f'{generate(f"@<{i}/.*>", public_header)},')

    for i in detail_files:
        public = []
        if i == "__assert":
            continue
        elif i == "__availability":
            continue
        elif i == "__bit_reference":
            continue
        elif i == "__bits":
            public = ["bits"]
        elif i == "__config_site.in":
            continue
        elif i == "__config":
            continue
        elif i == "__debug":
            continue
        elif i == "__errc":
            continue
        elif i == "__hash_table":
            public = ["unordered_map", "unordered_set"]
        elif i == "__locale":
            public = ["locale"]
        elif i == "__mbstate_t.h":
            continue
        elif i == "__mutex_base":
            continue
        elif i == "__node_handle":
            public = ["map", "set", "unordered_map", "unordered_set"]
        elif i == "__pstl_algorithm":
            continue
        elif i == "__pstl_config_site.in":
            continue
        elif i == "__pstl_execution":
            continue
        elif i == "__pstl_memory":
            continue
        elif i == "__pstl_numeric":
            continue
        elif i == "__split_buffer":
            public = ["deque", "vector"]
        elif i == "__std_mbstate_t.h":
            continue
        elif i == "__threading_support":
            public = ["atomic", "mutex", "semaphore", "thread"]
        elif i == "__tree":
            public = ["map", "set"]
        elif i == "__undef_macros":
            continue
        elif i == "__verbose_abort":
            continue
        else:
            panic(i)

        for p in public:
            result.append(f'{generate(f"<{i}>", p)},')

    result.sort()
    return result


def main():
    monorepo_root = pathlib.Path(
        os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    )
    assert monorepo_root.exists()
    include = pathlib.Path(os.path.join(monorepo_root, "libcxx", "include"))

    mapping = generate_map(include)
    data = "[\n  " + "\n  ".join(mapping) + "\n]\n"
    with open(f"{include}/libcxx.imp", "w") as f:
        f.write(data)


if __name__ == "__main__":
    main()
