# Prints a tree of all items in the configuration
# vim: tabstop=4 shiftwidth=4 expandtab

import kconfiglib
import sys

# Integers representing symbol types
UNKNOWN, BOOL, TRISTATE, STRING, HEX, INT = range(6)

# Strings to use for types
TYPENAME = {UNKNOWN: "unknown", BOOL: "bool", TRISTATE: "tristate",
            STRING: "string", HEX: "hex", INT: "int"}

done = []

def print_with_indent(s, indent):
    print((" " * indent) + s)

def print_items(items, outdir, indent):
    for item in items:
        if item.is_symbol() or item.is_choice():
            text = item.get_help()
        elif item.is_menu():
            text = item.get_title()
        else:
            # Comment
            text = item.get_text()
        if item.is_symbol():
            #print_with_indent("config {0}".format(item.get_name()), indent)

            var = "CONFIG_%s" %item.get_name()
            if not var in done:
                done.append(var)
                f.write("     %s.rst\n" %var)
                config = open("%s/%s.rst" % (outdir, var), "w")
                config.write("\n.. _CONFIG_%s:\n" %item.get_name())
                config.write("\n%s\n" %var)
                config.write("%s\n\n" %(len("%s" %var) * '#' ))
                if text:
                    config.write("\n%s\n\n" %text)
                else:
                    config.write("\nThe configuration item %s:\n\n" %var)
                config.write(item.rest())

                config.close()
        elif item.is_menu():
            #print_with_indent('menu "{0}"'.format(item.get_title()), indent)
            print_items(item.get_items(), outdir, indent + 2)
        elif item.is_choice():
            #print_with_indent('choice', indent)
            print_items(item.get_items(), outdir, indent + 2)
        elif item.is_comment():
            pass
            #print_with_indent('comment "{0}"'.format(item.get_text()), indent)


f = open("%s/index.rst" % (sys.argv[2]), "w")
f.write(""".. _configuration:

Configuration Options Reference Guide
#####################################

Introduction
************

Kconfig files describe the configuration symbols supported in the build
system, the logical organization and structure that group the symbols in menus
and sub-menus, and the relationships between the different configuration
symbols that govern the valid configuration combinations.

The Kconfig files are distributed across the build directory tree. The files
are organized based on their common characteristics and on what new symbols
they add to the configuration menus.

The configuration options' information is extracted directly from :program:`Kconfig`
using the :file:`~/doc/scripts/genrest/genrest.py` script.


Supported Options
*****************

""")
f.write(".. toctree::\n     :maxdepth: 2\n\n")
conf = kconfiglib.Config(sys.argv[1])
print_items(conf.get_top_level_items(), sys.argv[2],  0)
f.close()
