from wa.framework.configuration.core import MetaConfiguration, RunConfiguration
from wa.framework.configuration.plugin_cache import PluginCache
from wa.utils.serializer import yaml
from wa.utils.doc import strip_inlined_text

DEFAULT_AUGMENTATIONS = ['execution_time',
                         'interrupts',
                         'cpufreq',
                         'status',
                         'csv'
                        ]


def _format_yaml_comment(param, short_description=False):
    comment = param.description
    comment = strip_inlined_text(comment)
    if short_description:
        comment = comment.split('\n\n')[0]
    comment = comment.replace('\n', '\n# ')
    comment = "# {}\n".format(comment)
    return comment


def _format_augmentations(output):
    plugin_cache = PluginCache()
    output.write("augmentations:\n")
    for plugin in DEFAULT_AUGMENTATIONS:
        plugin_cls = plugin_cache.loader.get_plugin_class(plugin)
        output.writelines(_format_yaml_comment(plugin_cls, short_description=True))
        output.write(" - {}\n".format(plugin))
        output.write("\n")


def generate_default_config(path):
    with open(path, 'w') as output:
        for param in MetaConfiguration.config_points + RunConfiguration.config_points:
            entry = {param.name: param.default}
            write_param_yaml(entry, param, output)
        _format_augmentations(output)


def write_param_yaml(entry, param, output):
    comment = _format_yaml_comment(param)
    output.writelines(comment)
    yaml.dump(entry, output, default_flow_style=False)
    output.write("\n")