#!/usr/bin/python2
"""
Further display the tests in a matrix of the form tests X machines
to help understand the results selected from the previous form.
"""

print "Content-type: text/html\n"
import cgi, cgitb, os, sys, re
sys.stdout.flush()
cgitb.enable()

import common
from autotest_lib.tko import db, display, frontend

db = db.db()

def main():
    display.print_main_header()
    
    form = cgi.FieldStorage()

    if form.has_key('sql'):
        sql = form['sql'].value

    if form.has_key('values'):
        values = [val for val in form['values'].value.split(',')]

    if not sql:
        return
    if not values:
        return

    tests = frontend.test.select_sql(db, sql, values)

    # get the list of tests/machines to populate the row and column header.
    testname = [test.testname for test in tests]
    machine_idx = [test.machine_idx for test in tests]

    # We dont want repetitions in the table row/column headers,
    # so eliminate the dups.
    uniq_test = list(set(testname))
    uniq_machine_idx = list(set(machine_idx))

    header_row = [ display.box('', header = True) ]
    for test_name in uniq_test:
        header_row.append(display.box(test_name, header=True))
    matrix = [header_row]
    for machine in uniq_machine_idx:
        mach_name = db.select_sql('hostname', 'machines',
                 ' where machine_idx=%s', [str(machine)])
        row = [display.box(mach_name[0][0])]
        for test_name in uniq_test:
            testlist = [test for test in tests
                     if test.machine_idx == machine
                     and test.testname == test_name]
            # url link to the first test.
            # TODO: provide another level to show the different
            #    test results.
            link = None
            if testlist and testlist[0]:
                link = testlist[0].url
            box = display.status_count_box(db, testlist, link=link)
            row.append(box)
        matrix.append(row)
    display.print_table(matrix)

main()
