import sys
import os
import re

from configobj import ConfigObj
from validate import Validator

HERE = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(HERE, '..', '..'))

from alot.commands import COMMANDS


NOTE = """
.. CAUTION: THIS FILE IS AUTO-GENERATED
    from the inline comments of specfile %s.

    If you want to change its content make your changes
    to that spec to ensure they woun't be overwritten later.
"""


def rewrite_entries(config, path, specpath, sec=None):
    file = open(path, 'w')
    file.write(NOTE % specpath)

    if sec is None:
        sec = config
    for entry in sorted(sec.scalars):
        v = Validator()
        etype, eargs, _, default = v._parse_check(sec[entry])
        if default is not None:
            default = config._quote(default)

        if etype == 'gpg_key_hint':
            etype = 'string'
        description = '\n.. _%s:\n' % entry.replace('_', '-')
        description += '\n.. describe:: %s\n\n' % entry
        comments = [sec.inline_comments[entry]] + sec.comments[entry]
        for c in comments:
            if c:
                description += ' ' * 4 + re.sub(r'^\s*#', '', c)
                description = description.rstrip(' ') + '\n'
        if etype == 'option':
            description += '\n    :type: option, one of %s\n' % eargs
        else:
            if etype == 'force_list':
                etype = 'string list'
            description += '\n    :type: %s\n' % etype

        if default is not None:
            default = default.replace('*', '\\*')
            if etype in ['string', 'string_list', 'gpg_key_hint'] and \
                    default != 'None':
                description += '    :default: "%s"\n\n' % (default)
            else:
                description += '    :default: %s\n\n' % (default)
        file.write(description)
    file.close()


if __name__ == "__main__":
    specpath = os.path.join(HERE, '..', '..', 'alot', 'defaults',
                            'alot.rc.spec')
    config = ConfigObj(None, configspec=specpath, stringify=False,
                       list_values=False)
    config.validate(Validator())

    alotrc_table_file = os.path.join(HERE, 'configuration', 'alotrc_table')
    rewrite_entries(config.configspec, alotrc_table_file,
                    'defaults/alot.rc.spec')

    rewrite_entries(config,
                    os.path.join(HERE, 'configuration', 'accounts_table'),
                    'defaults/alot.rc.spec',
                    sec=config.configspec['accounts']['__many__'])
