#!/usr/bin/env python
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 >> sys.stderr, "file not found: %s" % args[0]
            sys.exit(1)
    else:
        trie = json.load(sys.stdin)

    results = convert_trie_to_flat_paths(trie)
    tests_run = []
    for (test, result) in results.iteritems():
        # 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.iteritems():
        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:])
