import os
import md5
import json
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS
import time
import datetime
from time import gmtime, strftime

def get_exif_data(image):
	"""Returns a dictionary from the exif data of an PIL Image item. Also converts the GPS Tags"""
	exif_data = {}
	info = image._getexif()
	if info:
		for tag, value in info.items():
			decoded = TAGS.get(tag, tag)
			if decoded == "GPSInfo":
				gps_data = {}
				for t in value:
					sub_decoded = GPSTAGS.get(t, t)
					gps_data[sub_decoded] = value[t]
 
				exif_data[decoded] = gps_data
			else:
				exif_data[decoded] = value
 
	return exif_data
 
def _get_if_exist(data, key):
	if key in data:
		return data[key]
		
	return None
	
def _convert_to_degress(value):
	"""Helper function to convert the GPS coordinates stored in the EXIF to degress in float format"""
	d0 = value[0][0]
	d1 = value[0][1]
	d = float(d0) / float(d1)
 
	m0 = value[1][0]
	m1 = value[1][1]
	m = float(m0) / float(m1)
 
	s0 = value[2][0]
	s1 = value[2][1]
	s = float(s0) / float(s1)
 
	return d + (m / 60.0) + (s / 3600.0)
 
def get_lat_lon(exif_data):
	"""Returns the latitude and longitude, if available, from the provided exif_data (obtained through get_exif_data above)"""
	lat = None
	lon = None
 
	if "GPSInfo" in exif_data:		
		gps_info = exif_data["GPSInfo"]
 
		gps_latitude = _get_if_exist(gps_info, "GPSLatitude")
		gps_latitude_ref = _get_if_exist(gps_info, 'GPSLatitudeRef')
		gps_longitude = _get_if_exist(gps_info, 'GPSLongitude')
		gps_longitude_ref = _get_if_exist(gps_info, 'GPSLongitudeRef')
 
		if gps_latitude and gps_latitude_ref and gps_longitude and gps_longitude_ref:
			lat = _convert_to_degress(gps_latitude)
			if gps_latitude_ref != "N":					 
				lat = 0 - lat
 
			lon = _convert_to_degress(gps_longitude)
			if gps_longitude_ref != "E":
				lon = 0 - lon
 
	return lon , lat
 
 
if __name__ == "__main__":

	######EDIT THESE##########	
	path  = "/home/thej/"
	s3_dir_path ="http://media.thejeshgn.com/final_server_path/"
	taken_by = "Thejesh GN"
	################

	geojson = {}
	geojson["type"] = "FeatureCollection"
	features = []


	for dir_entry in os.listdir(path):
		dir_entry_path = os.path.join(path, dir_entry)
		if os.path.isfile(dir_entry_path):	
			image = Image.open(dir_entry_path)
			s3_path = s3_dir_path+dir_entry
			exif_data = get_exif_data(image)
			m = md5.new()
			m.update(s3_path)
			key = m.hexdigest()
			timestamp = exif_data['DateTimeOriginal']
			taken_at = time.strptime(timestamp, "%Y:%m:%d %H:%M:%S")

			# print taken_by
			# print s3_path
			#print exif_data['DateTimeOriginal']
			# print get_lat_lon(exif_data)
			# print m.hexdigest()

			properties = {}		
			properties['taken_by']=taken_by
			properties['s3_path']=s3_path
			properties['id']=key
			#http://en.wikipedia.org/wiki/ISO_8601
			# P[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]
			properties['taken_at']=strftime("%Y-%m-%dT%H:%M:%S", taken_at)



			single_feature = {}
			single_feature['geometry']= { "coordinates":get_lat_lon(exif_data), "type" : "Point" }
			single_feature['properties']=properties
			single_feature["type"]= "Feature"
			features.append(single_feature)
	
	geojson["features"]=features	
	print json.dumps(geojson)



