#!/usr/bin/python

import sys, optparse
import common
from autotest_lib.cli import rpc


def parse_options():
    usage = "usage: %prog [options] job_id"
    parser = optparse.OptionParser(usage=usage)
    parser.add_option("-m", "--machine", dest="machine")
    parser.add_option("-t", "--test", dest="test")
    parser.add_option("-T", "--type", dest="type", type="choice",
                      choices=["all", "test", "iteration", "attr", "perf"])
    parser.add_option("-k", "--key", dest="key")
    parser.set_defaults(type="all")
    options, args = parser.parse_args()
    options.show_test_keyvals = options.type in ("all", "test")
    options.show_attr_keyvals = options.type in ("all", "iteration", "attr")
    options.show_perf_keyvals = options.type in ("all", "iteration", "perf")
    options.show_iter_keyvals = (
        options.show_perf_keyvals or options.show_attr_keyvals)
    return parser, options, args


def print_keyvals(keyval, format_string, options):
    for key, value in keyval.iteritems():
        if not options.key or key == options.key:
            print format_string % (key, value)


def print_views(test_views, options):
    for view in test_views:
        if not options.machine:
            print "Machine: %s" % view["hostname"]
        if not options.test:
            print "Test: %s" % view["test_name"]
        if options.show_test_keyvals:
            print "Test Attributes:"
            print_keyvals(view["attributes"], "\t%s = %s", options)
        if options.show_iter_keyvals:
            print "Iteration Attributes:"
            for i, iteration in enumerate(view["iterations"]):
                print "\tIteration #%d:" % (i + 1)
                if options.show_attr_keyvals:
                    print_keyvals(iteration["attr"], "\t\t%s(attr) = %s",
                                  options)
                if options.show_perf_keyvals:
                    print_keyvals(iteration["perf"], "\t\t%s(perf) = %s",
                                  options)
        print


def main():
    parser, options, args = parse_options()
    if not args:
        parser.print_help()
        return

    query_filter = {}
    if options.machine:
        query_filter["hostname"] = options.machine
    if options.test:
        query_filter["test_name"] = options.test

    comm = rpc.tko_comm()
    test_views = []
    for job_id in args:
        query_filter["job_tag__startswith"] = "%s-" % job_id
        test_views += comm.run("get_detailed_test_views", **query_filter)
    print_views(test_views, options)


if __name__ == "__main__":
    main()
