# 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 = []
itemIndex = {}

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():
            var = "CONFIG_%s" %item.get_name()
            if not var in done:
                done.append(var)

                # Save up the config items in itemIndex, a dictionary indexed
                # by the item name with the value as the "prompt" (short
                # description) from the Kconfig file.  (We'll output them
                # later in alphabetic order

                if len(item.get_prompts()) > 0:
                    p = item.get_prompts()[0]
                else:
                    p = ""
                itemIndex[var] = "   * - :option:`%s`\n     - %s\n" % (var, p)

                # Create a details .rst document for each symbol discovered

                config = open("%s/%s.rst" % (outdir, var), "w")
                config.write(":orphan:\n\n")
                config.write(".. title:: %s\n\n" %item.get_name())
                config.write(".. option:: CONFIG_%s:\n" %item.get_name())
                config.write(".. _CONFIG_%s:\n" %item.get_name())
                if text:
                    config.write("\n%s\n\n" %text)
                else:
                    config.write("\nThe configuration item %s:\n\n" %var)
                config.write("%s\n" %item.rest())

                config.close()
        elif item.is_menu():
            print_items(item.get_items(), outdir, indent + 2)
        elif item.is_choice():
            print_items(item.get_items(), outdir, indent + 2)
        elif item.is_comment():
            pass


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 below is extracted directly from
:program:`Kconfig` using the :file:`~/doc/scripts/genrest/genrest.py` script.
Click on the option name in the table below for detailed information about
each option.


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

.. list-table:: Alphabetized Index of Configuration Options
   :header-rows: 1

   * - Kconfig Symbol
     - Description
""")
conf = kconfiglib.Config(sys.argv[1])
print_items(conf.get_top_level_items(), sys.argv[2],  0)

# print_items created separate .rst files for each configuration option as
# well as filling itemIndex with all these options (and their descriptions).
# Now we can print out the accumulated config symbols in alphabetic order.

for item in sorted(itemIndex):
    f.write(itemIndex[item])

f.close()
