"""test-suite/lit plugin to collect internal llvm json statistics.

This assumes the benchmarks were built with the -save-stats=obj flag."""
import json
import lit.Test
import logging
import os
from collections import defaultdict


def _mergeStats(global_stats, statsfilename):
    try:
        f = open(statsfilename, "rt")
        stats = json.load(f)
    except Exception as e:
        logging.warning("Could not read '%s'", statsfilename, exc_info=e)
        return
    for name, value in stats.iteritems():
        global_stats[name] += value


def _getStats(context):
    # We compile multiple benchmarks in the same directory in SingleSource
    # mode. Only look at compiletime files starting with the name of our test.
    prefix = ""
    if context.config.single_source:
        prefix = "%s." % os.path.basename(context.executable)

    stats = defaultdict(lambda: 0.0)
    dir = os.path.dirname(context.test.getFilePath())
    for path, subdirs, files in os.walk(dir):
        for file in files:
            if file.endswith('.stats') and file.startswith(prefix):
                fullpath = os.path.join(path, file)
                _mergeStats(stats, fullpath)

    if len(stats) == 0:
        logging.warning("No stats for '%s'", context.test.getFullName())

    result = dict()
    for key, value in stats.iteritems():
        result[key] = lit.Test.toMetricValue(value)
    return result


def mutatePlan(context, plan):
    plan.metric_collectors.append(_getStats)
