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

tko = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0])))
sys.path.insert(0, tko)
import db, frontend, display
client_bin = os.path.abspath(os.path.join(tko, '../client/bin'))
sys.path.insert(0, client_bin)
import kernel_versions

db = db.db()


def kernel_group_box(kernel, group):
	tests = group.tests({ 'kernel_idx':kernel.idx })

	machine_idxs = ['%d' % machine.idx for machine in group.machines()]
	link = 'machine_kernel_test.cgi?machine=%s&kernel=%s' % \
					(','.join(machine_idxs), kernel.idx)
	return display.status_count_box(db, tests, link)


def kernel_encode(kernel):
	return kernel_versions.version_encode(kernel.printable)


def main():
	display.print_main_header()

	groups = frontend.group.select(db)

	group_names = [re.sub('_', '<br>', g.name) for g in groups]
	headers = ['Version'] + group_names
	header_row = [ display.box(x, header=True) for x in headers ] 

	kernels = frontend.kernel.select(db)
	kernels.sort(key = kernel_encode, reverse = True)

	matrix = [header_row]
	for kernel in kernels:
		link = 'group_test.cgi?kernel=%s' % kernel.idx
		row = [display.box(kernel.printable, link=link)]
		for group in groups:
			row.append(kernel_group_box(kernel, group))
		matrix.append(row)
	matrix.append(header_row)

	display.print_table(matrix)


main()
