#!/usr/bin/env python3

import json
import optparse
import os
import sys


def main(argv):
    parser = optparse.OptionParser(usage='%prog worker_number [path-to-stats.json]')
    _, args = parser.parse_args(argv)

    worker_number = int(args.pop(0))
    if args:
        if os.path.exists(args[0]):
            with open(args[0], 'r') as fp:
                trie = json.load(fp)
        else:
            print("file not found: %s" % args[0], file=sys.stderr)
            sys.exit(1)
    else:
        trie = json.load(sys.stdin)

    results = convert_trie_to_flat_paths(trie)
    tests_run = []
    for (test, result) in results.items():
        # Each result is a dict containing
        # { 'results': [worker #, test # in worker, driver pid,
        #   test time in msecs, test + compare time in msecs]}
        if result['results'][0] == worker_number:
            tests_run.append((test, result['results'][1]))

    print("\n".join(t[0] for t in sorted(tests_run, key=lambda t: t[1])))


def convert_trie_to_flat_paths(trie, prefix=None):
    # Cloned from webkitpy.layout_tests.layout_package.json_results_generator
    # so that this code can stand alone.
    result = {}
    for name, data in trie.items():
        if prefix:
            name = prefix + "/" + name

        if len(data) and not "results" in data:
            result.update(convert_trie_to_flat_paths(data, name))
        else:
            result[name] = data

    return result


if __name__ ==  '__main__':
    main(sys.argv[1:])
