#!/usr/bin/env python

import os, sys
from cgitools import isOnline, cgi_token, exitWithInfo, decodeStr, getCursor, inquireDB

#print   'Content-type:   text/plain   name="test_name"\n'
#print   'Content-Disposition:   inline; filename="obj.Rdata"\n\n'  

#print "Content-Type:application/octet-stream\n"
#print "Content-Disposition:attachment;filename='test_name'\n\n"


#print "Content-Disposition: attachment;filename=test_file\n"
#print "Content-Transfer-Encoding: binary\n"
#print "Accept-Ranges: bytes\n"
#print "Content-Length: %ld\n" % os.stat(fn).st_size
#print "Connection: close\n"
#print "Content-type: application/octet-stream\n"
#print "\n");  

# need a comma after "print" to prevent extra line char - '\n'
#print "Content-Type:application/x-download\n",
#print "Content-Disposition:attachment;filename=%s\n\n" % fn,
#print open(fn, 'rb').read(), # this will append a line char anyway

if not isOnline(): exitWithInfo('Logon first please.')

request_page = os.getenv('QUERY_STRING')
if not request_page: #is None: 
	request_page = os.getenv('PATH_INFO')
	if request_page and len(request_page)>1: request_page = request_page[1:] # remove the leading slash '/'
	else: exitWithInfo('No database name and record number offered!<p><input type="button" value="Go back" onClick="javascript:history.go(-1)"/>')

cur_db, rec_id = eval(decodeStr(request_page))

cursor = getCursor()

sampcols = map(lambda a:a[0], inquireDB('DESCRIBE %s.sample' % cur_db, cursor=cursor, fetch=True))
ind_str = 'individual_id' in sampcols and 's.individual_id' or 's.strain AS individual_id'
tis_str = 'tissue' in sampcols and 's.tissue' or '""'
gend_str = 'gender' in sampcols and 's.gender' or '""'
age_str = 'age' in sampcols and 's.age' or '""'

# read probe information from database
sql = '''
SELECT i.id, i.fg, i.bg, i.flag, i.channel_No, a.identifier, p.gene_symbol, p.unique_id, p.gene_title, s.id, s.name, %s, s.organism, %s, %s, %s, s.description
FROM %s.intensity i, %s.probe p, %s.array a, %s.sampxref x, %s.sample s
WHERE p.id=%d AND i.probe_id=%d AND i.array_id=a.id AND x.array_id=i.array_id AND x.channel_No=i.channel_No AND x.sample_id=s.id
ORDER BY i.id
''' % (ind_str, tis_str, gend_str, age_str, cur_db, cur_db, cur_db, cur_db, cur_db, rec_id, rec_id)
#infos = list(inquireDB(sql, cursor=cursor, fetch=True))
infos = map(lambda a:list(a), inquireDB(sql, cursor=cursor, fetch=True))

if not infos: exitWithInfo('No record found!<p><input type="button" value="Go back" onClick="javascript:history.go(-1)"/>')

print "Content-Type:application/x-download\n",
print "Content-Disposition:attachment;filename=%s_Probe_%d.txt\n\n" % (cur_db, rec_id),
#sys.stdout.write(open(filename, 'rb').read()) # write won't append a line char
print 'int_id	fg	bg	flag	channel_No	database	array	gene_symbol	gene_unique_id	gene_title	sample id	sample name	individual	organism	tissue	gender	age	sample description	other attributes'
#for line in infos: print '\t'.join(map(lambda a:str(a), line))
#for line in infos: print '\t'.join(map(lambda a:str(a), line.insert(5, cur_db) or line)) # [].insert return None


# add more sample info over here
sampids = map(lambda a:a[9], infos)
idic = dict(zip(sampids, sampids))
iloc = {'int':2, 'float':3, 'string':4}
for k, v in idic.items():
	samp = inquireDB('SELECT df.col_type, df.col_name, d.value_int, d.value_float, d.value_str FROM %s.dyncoldef df, %s.dyncol d WHERE df.id=d.col_id AND d.rec_id=%d AND df.tb_name="sample" ORDER BY df.col_name' % (cur_db, cur_db, k), cursor=cursor, fetch=True)
	samp =  map(lambda a:'%s = %s' % (a[1], a[iloc[a[0]]]), samp)
	idic[k] = '; '.join(samp)

for line in infos: print '\t'.join(map(lambda a:str(a), line.append(idic[line[9]]) or line.insert(5, cur_db) or line)) # [].insert return None

