#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import division, print_function, unicode_literals

"""dump transcripts in UTA as a bed file"""

import argparse
import os
import sys
import operator

import psycopg2, psycopg2.extras
from bioutils.accessions import prepend_chr, NC_to_chr

def parse_args(argv):
	ap = argparse.ArgumentParser(
		description = __doc__,
        formatter_class = argparse.ArgumentDefaultsHelpFormatter,
		)
	ap.add_argument(
		"--method", "-m",
		required = True,
		choices = ["splign","blat","genebuild"],
		help = "filter transcripts by this alignment method",
		)
	ap.add_argument(
		"--schema",
		default = "uta_20140210",
		)
	opts = ap.parse_args()
	return opts

def lengths_to_starts(lengths):
	return reduce(lambda acc, itm: operator.iadd(acc, [acc[-1] + itm]), lengths, [0])

def find_exon(starts,c):
	return 


if __name__ == '__main__':
	opts = parse_args(sys.argv[1:])

	conn = psycopg2.connect(dbname='uta',host='localhost')
	cur = conn.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor)

	query = """
	SELECT ESS.*,T.cds_start_i,T.cds_end_i
	FROM {opts.schema}.tx_exon_set_summary_mv ESS
	JOIN {opts.schema}.transcript T ON ESS.tx_ac=T.ac
	WHERE tx_ac ~ '^NM_' AND alt_ac ~ '^NC_0000' AND alt_aln_method = %s
	"""

	cur.execute(query.format(opts=opts), [opts.method])

	print('#gffTags\ntrack name={opts.schema}_{opts.method} type=bedDetail description="{opts.method} alignments from UTA ({opts.schema}) visibility=3"'.format(
		opts=opts))

	for row in cur:
		chrom_starts = sorted(row.starts_i)

		chrom_start = chrom_starts[0]
		chrom_end = sorted(row.ends_i)[-1]

		block_starts = [ s - chrom_starts[0] for s in chrom_starts ]

		block_sizes = list(row.lengths)
		if row.alt_strand == -1:
			block_sizes.reverse()

		thick_start = chrom_start
		thick_end = chrom_end

		print('\t'.join([
			prepend_chr(NC_to_chr[row.alt_ac]),	 # chrom 'chr..'
			str(chrom_start),
			str(chrom_end),
			row.tx_ac,									 # name
			'0',										 # score
			'+' if row.alt_strand == 1 else '-',		 # strand
			str(thick_start),							 # thickStart
			str(thick_end),								 # thickEnd
			'0',										 # itemRgb
			str(len(block_starts)),						 # blockCount
			','.join(map(str,block_sizes))+',',			 #
			','.join(map(str,block_starts))+',',		 #
			]))
			
#chr10	52559168	52645435	NM_001198820.1	1	-	0	0	0	14	7472,149,137,182,274,98,165,239,131,135,143,144,48,95	52559168,52569653,52570799,52573616,52575765,52580311,52587890,52595833,52601621,52603747,52610424,52619601,52623792,52645340
#chr10	52559168	52645435	NM_001198818.1	1	-	0	0	0	14	7472,149,137,182,274,98,165,239,131,135,144,93,48,95	52559168,52569653,52570799,52573616,52575765,52580311,52587890,52595833,52601621,52603747,52619601,52622648,52623792,52645340
#chr1	12704565	12727097	NM_001013630.1	1	+	0	0	0	4	168,217,64,1126	12704565,12711141,12721801,12725971
#chr2	69685126	69870977	NM_014911.3	1	-	0	0	0	22	17969,111,111,102,102,96,105,158,230,279,287,155,80,104,133,82,122,143,109,119,397,271	69685126,69704011,69706082,69707991,69709842,69723116,69732700,69734552,69736362,69741602,69746085,69747965,69752164,69754347,69757139,69757756,69759172,69769654,69771567,69783991,69870009,69870706
#chr7	48211056	48687091	NM_152701.3	1	+	0	0	0	62	93,94,124,152,29,164,131,134,165,200,128,101,168,206,140,115,4779,1827,110,119,164,80,122,195,165,178,140,114,91,177,307,115,330,70,132,138,181,219,197,158,231,106,250,90,70,119,88,109,55,178,116,157,254,193,110,151,135,104,93,106,138,2079	48211056,48232555,48237833,48258950,48260877,48266858,48269421,48273614,48278837,48280463,48284172,48285108,48285459,48287835,48288808,48308576,48311383,48317690,48320939,48327556,48335296,48336828,48337962,48349543,48352663,48353828,48356753,48375018,48377961,48390239,48391777,48407390,48411764,48413943,48416037,48427418,48428636,48431517,48443279,48450116,48451949,48467362,48494633,48506552,48511126,48520632,48522672,48528832,48545931,48547467,48550679,48556320,48559636,48563843,48567831,48619819,48626749,48634305,48654880,48682883,48684212,48685012
#chr17	67074846	67138015	NM_080284.2	1	-	0	0	0	39	369,56,80,141,120,95,76,155,92,118,121,92,78,120,114,174,108,138,134,167,184,117,140,91,139,120,176,111,59,169,148,186,142,227,104,159,205,141,130	67074846,67075350,67077206,67079013,67079352,67080401,67080572,67081168,67081765,67082758,67083493,67084307,67085605,67087283,67092380,67092768,67094060,67096937,67098975,67101602,67102168,67103836,67106941,67108323,67109362,67109758,67110902,67111516,67114038,67119379,67121028,67124759,67125750,67129781,67130779,67132232,67133436,67136748,67137885
#chr7	87031360	87105019	NM_018850.2	1	-	0	0	0	27	258,147,207,198,157,101,204,84,78,105,147,171,162,171,204,126,111,114,172,125,172,192,58,151,55,86,70	87031360,87032450,87035603,87037352,87038551,87042932,87046627,87047852,87049313,87051436,87053221,87056065,87060719,87068982,87069514,87072634,87072978,87074177,87076349,87079283,87080938,87082259,87083850,87092073,87101936,87104701,87104949
#chrX	74273006	74376175	NM_001271698.1	1	-	0	0	0	15	414,108,104,172,130,164,158,175,88,89,269,133,120,87,236	74273006,74280057,74282162,74284904,74288841,74289125,74290199,74291343,74293523,74293702,74295196,74296356,74318776,74332720,74375939


#track name="tb_knownGene" description="table browser query on knownGene" visibility=3 url= 
#chr1	11873	14409	uc001aaa.3	0	+	11873	11873	0	3	354,109,1189,	0,739,1347,
#chr1	11873	14409	uc010nxr.1	0	+	11873	11873	0	3	354,52,1189,	0,772,1347,
#chr1	11873	14409	uc010nxq.1	0	+	12189	13639	0	3	354,127,1007,	0,721,1529,
#chr1	14361	16765	uc009vis.3	0	-	14361	14361	0	4	468,69,147,159,	0,608,1434,2245,
#chr1	16857	17751	uc009vjc.1	0	-	16857	16857	0	2	198,519,	0,375,
#chr1	15795	18061	uc009vjd.2	0	-	15795	15795	0	5	152,159,198,136,456,	0,811,1062,1437,1810,
