#! /usr/bin/python
#
# This script was written and placed into the public domain by 
# Joerg Reuter <jreuter@yaina.de>. No guarantee, warranty or liability
# whatsoever. Even no support. Use at your own risk.
#

import sys
import os
from time import *
from math import *

if len(sys.argv) < 2:
	print "usage: csv2gpx.py filename [metadatafile [timezone]]"
	sys.exit(1)

track = sys.argv[1]
metafile = ""

if len(sys.argv) > 2:
	metafile== sys.argv[2]

if len(sys.argv) > 3:
	os.environ['TZ']=sys.argv[3]
else:
	os.environ['TZ']="America/Los_Angeles"

tzset()

lat_min=90
lat_max=-90
lon_min=180
lon_max=-180
time_max=0

trackpoints=[]
routepoints=[]

fd_track = open(track)
if len(metafile) > 0: fd_meta = open(metafile)

for line in fd_track:
	sline = line.split(",")

	tst  = float(sline[0])
	type = sline[1]
	lat  = float(sline[2])
	lon  = float(sline[3])
	alt  = float(sline[4])

	if lat < lat_min: lat_min = lat
	if lat > lat_max: lat_max = lat
	if lon < lon_min: lon_min = lon
	if lon > lon_max: lon_max = lon
	if tst > time_max: time_max = tst

	trackpoints.append((type, tst, lat, lon, alt))
	if type == "1": routepoints.append((tst, lat, lon, alt))

print """<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="Yaina.DE" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>"""

print '\t<time>'+strftime("%Y-%m-%dT%H:%M:%SZ", gmtime(tst))+'</time>'
print '\t<bounds minlat="'+str(lat_min)+'" minlon="'+str(lon_min)+'" maxlat="'+str(lat_max)+'" maxlon="'+str(lon_max)+'"/>'

if len(metafile) > 0:
	for line in fd_meta:
		print '\t'+line

print '</metadata>'
print '<rte>'

for rp in routepoints:
	print '\t<rtept lat="'+str(rp[1])+'" lon="'+str(rp[2])+'">'
	print '\t\t<ele>'+str(rp[3])+'</ele>'
	print '\t\t<time>'+strftime("%Y-%m-%dT%H:%M:%SZ", gmtime(rp[0]))+'</time>'
	print '\t</rtept>'

print '</rte>'

count = 0
theoldday=""
itsanewday = 0

for tp in trackpoints:
	(type, tst, lat, lon, alt) = tp

	if type == "1":
		theday = strftime("%a, %d. %b %Y", localtime(tst))
		tstring = strftime("%H:%M", localtime(tst))

		if count != 0:
			print '\t</trkseg>'

		if theoldday != theday:
			if count != 0: print '</trk>'
			print '<trk>'
			print '\t<name>'+theday+'</name>'
			print '\t<desc>'+theday+' '+tstring+'</desc>'

		theoldday = theday
		count = count+1

		print '\t<trkseg>'

	print '\t\t<trkpt lat="'+str(lat)+'" lon="'+str(lon)+'">'
	print '\t\t\t<ele>'+str(alt)+'</ele>'
	print '\t\t\t<time>'+strftime("%Y-%m-%dT%H:%M:%SZ", gmtime(tst))+'</time>'
	print '\t\t</trkpt>'


print """\t</trkseg>
</trk>
</gpx>
"""

