from atila import Atila
import time, math
import json
from services import route_guide_pb2

app = Atila (__name__)
app.debug = True
app.use_reloader = True


def get_feature (feature_db, point):
	for feature in feature_db:
		if feature.location == point:
			return feature
	return None

def get_distance(start, end):
	coord_factor = 10000000.0
	lat_1 = start.latitude / coord_factor
	lat_2 = end.latitude / coord_factor
	lon_1 = start.longitude / coord_factor
	lon_2 = end.longitude / coord_factor
	lat_rad_1 = math.radians(lat_1)
	lat_rad_2 = math.radians(lat_2)
	delta_lat_rad = math.radians(lat_2 - lat_1)
	delta_lon_rad = math.radians(lon_2 - lon_1)

	a = (pow(math.sin(delta_lat_rad / 2), 2) +
			 (math.cos(lat_rad_1) * math.cos(lat_rad_2) *
				pow(math.sin(delta_lon_rad / 2), 2)))
	c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
	R = 6371000; # metres
	return R * c

@app.route ("/RouteChat")
def RouteChat (was, new_notes):
	prev_notes = []	
	for new_note in new_notes:
		for prev_note in prev_notes:
			if prev_note.location == new_note.location:
				yield prev_note
		prev_notes.append(new_note)	
		
@app.route ("/RecordRoute")
def RecordRoute (self, points):	
	point_count = 0
	feature_count = 0
	distance = 0.0
	prev_point = None

	start_time = time.time()
	for point in points:
		point_count += 1
		if get_feature(db, point):
			feature_count += 1
		if prev_point:
			distance += get_distance(prev_point, point)
		prev_point = point

	elapsed_time = time.time() - start_time
	return route_guide_pb2.RouteSummary(
		point_count=point_count,
		feature_count=feature_count,
		distance=int(distance),
		elapsed_time=int(elapsed_time)
	)
		
@app.route ("/GetFeature")
def GetFeature (was, point):
	feature = get_feature(db, point)
	if feature is None:
		return route_guide_pb2.Feature(name="", location=point)
	else:
		return feature

@app.route ("/ListFeatures")
def ListFeatures (was, rectangle):
	left = min(rectangle.lo.longitude, rectangle.hi.longitude)
	right = max(rectangle.lo.longitude, rectangle.hi.longitude)
	top = max(rectangle.lo.latitude, rectangle.hi.latitude)
	bottom = min(rectangle.lo.latitude, rectangle.hi.latitude)
	for feature in db:
		if (feature.location.longitude >= left and feature.location.longitude <= right and feature.location.latitude >= bottom and feature.location.latitude <= top):
			yield feature
	
@app.route ("/test")
def test (was):	
	stub = was.grpc ("http://127.0.0.1:5000/routeguide.RouteGuide")
	point = route_guide_pb2.Point (latitude=409146138, longitude=-746188906)
	feature = stub.GetFeature (point)
	rs = feature.dispatch ()
	return str (rs.data)
	

@app.route ("/")
def index (was):	
	return "<h1>Route Guide<h1>"
	
_jsondb = """	
[{
		"location": {
				"latitude": 407838351,
				"longitude": -746143763
		},
		"name": "Patriots Path, Mendham, NJ 07945, USA"
}, {
		"location": {
				"latitude": 408122808,
				"longitude": -743999179
		},
		"name": "101 New Jersey 10, Whippany, NJ 07981, USA"
}, {
		"location": {
				"latitude": 413628156,
				"longitude": -749015468
		},
		"name": "U.S. 6, Shohola, PA 18458, USA"
}, {
		"location": {
				"latitude": 419999544,
				"longitude": -740371136
		},
		"name": "5 Conners Road, Kingston, NY 12401, USA"
}, {
		"location": {
				"latitude": 414008389,
				"longitude": -743951297
		},
		"name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA"
}, {
		"location": {
				"latitude": 419611318,
				"longitude": -746524769
		},
		"name": "287 Flugertown Road, Livingston Manor, NY 12758, USA"
}, {
		"location": {
				"latitude": 406109563,
				"longitude": -742186778
		},
		"name": "4001 Tremley Point Road, Linden, NJ 07036, USA"
}, {
		"location": {
				"latitude": 416802456,
				"longitude": -742370183
		},
		"name": "352 South Mountain Road, Wallkill, NY 12589, USA"
}, {
		"location": {
				"latitude": 412950425,
				"longitude": -741077389
		},
		"name": "Bailey Turn Road, Harriman, NY 10926, USA"
}, {
		"location": {
				"latitude": 412144655,
				"longitude": -743949739
		},
		"name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA"
}, {
		"location": {
				"latitude": 415736605,
				"longitude": -742847522
		},
		"name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA"
}, {
		"location": {
				"latitude": 413843930,
				"longitude": -740501726
		},
		"name": "162 Merrill Road, Highland Mills, NY 10930, USA"
}, {
		"location": {
				"latitude": 410873075,
				"longitude": -744459023
		},
		"name": "Clinton Road, West Milford, NJ 07480, USA"
}, {
		"location": {
				"latitude": 412346009,
				"longitude": -744026814
		},
		"name": "16 Old Brook Lane, Warwick, NY 10990, USA"
}, {
		"location": {
				"latitude": 402948455,
				"longitude": -747903913
		},
		"name": "3 Drake Lane, Pennington, NJ 08534, USA"
}, {
		"location": {
				"latitude": 406337092,
				"longitude": -740122226
		},
		"name": "6324 8th Avenue, Brooklyn, NY 11220, USA"
}, {
		"location": {
				"latitude": 406421967,
				"longitude": -747727624
		},
		"name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA"
}, {
		"location": {
				"latitude": 416318082,
				"longitude": -749677716
		},
		"name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA"
}, {
		"location": {
				"latitude": 415301720,
				"longitude": -748416257
		},
		"name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA"
}, {
		"location": {
				"latitude": 402647019,
				"longitude": -747071791
		},
		"name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA"
}, {
		"location": {
				"latitude": 412567807,
				"longitude": -741058078
		},
		"name": "New York State Reference Route 987E, Southfields, NY 10975, USA"
}, {
		"location": {
				"latitude": 416855156,
				"longitude": -744420597
		},
		"name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA"
}, {
		"location": {
				"latitude": 404663628,
				"longitude": -744820157
		},
		"name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA"
}, {
		"location": {
				"latitude": 407113723,
				"longitude": -749746483
		},
		"name": ""
}, {
		"location": {
				"latitude": 402133926,
				"longitude": -743613249
		},
		"name": ""
}, {
		"location": {
				"latitude": 400273442,
				"longitude": -741220915
		},
		"name": ""
}, {
		"location": {
				"latitude": 411236786,
				"longitude": -744070769
		},
		"name": ""
}, {
		"location": {
				"latitude": 411633782,
				"longitude": -746784970
		},
		"name": "211-225 Plains Road, Augusta, NJ 07822, USA"
}, {
		"location": {
				"latitude": 415830701,
				"longitude": -742952812
		},
		"name": ""
}, {
		"location": {
				"latitude": 413447164,
				"longitude": -748712898
		},
		"name": "165 Pedersen Ridge Road, Milford, PA 18337, USA"
}, {
		"location": {
				"latitude": 405047245,
				"longitude": -749800722
		},
		"name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA"
}, {
		"location": {
				"latitude": 418858923,
				"longitude": -746156790
		},
		"name": ""
}, {
		"location": {
				"latitude": 417951888,
				"longitude": -748484944
		},
		"name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA"
}, {
		"location": {
				"latitude": 407033786,
				"longitude": -743977337
		},
		"name": "26 East 3rd Street, New Providence, NJ 07974, USA"
}, {
		"location": {
				"latitude": 417548014,
				"longitude": -740075041
		},
		"name": ""
}, {
		"location": {
				"latitude": 410395868,
				"longitude": -744972325
		},
		"name": ""
}, {
		"location": {
				"latitude": 404615353,
				"longitude": -745129803
		},
		"name": ""
}, {
		"location": {
				"latitude": 406589790,
				"longitude": -743560121
		},
		"name": "611 Lawrence Avenue, Westfield, NJ 07090, USA"
}, {
		"location": {
				"latitude": 414653148,
				"longitude": -740477477
		},
		"name": "18 Lannis Avenue, New Windsor, NY 12553, USA"
}, {
		"location": {
				"latitude": 405957808,
				"longitude": -743255336
		},
		"name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA"
}, {
		"location": {
				"latitude": 411733589,
				"longitude": -741648093
		},
		"name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA"
}, {
		"location": {
				"latitude": 412676291,
				"longitude": -742606606
		},
		"name": "1270 Lakes Road, Monroe, NY 10950, USA"
}, {
		"location": {
				"latitude": 409224445,
				"longitude": -748286738
		},
		"name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA"
}, {
		"location": {
				"latitude": 406523420,
				"longitude": -742135517
		},
		"name": "652 Garden Street, Elizabeth, NJ 07202, USA"
}, {
		"location": {
				"latitude": 401827388,
				"longitude": -740294537
		},
		"name": "349 Sea Spray Court, Neptune City, NJ 07753, USA"
}, {
		"location": {
				"latitude": 410564152,
				"longitude": -743685054
		},
		"name": "13-17 Stanley Street, West Milford, NJ 07480, USA"
}, {
		"location": {
				"latitude": 408472324,
				"longitude": -740726046
		},
		"name": "47 Industrial Avenue, Teterboro, NJ 07608, USA"
}, {
		"location": {
				"latitude": 412452168,
				"longitude": -740214052
		},
		"name": "5 White Oak Lane, Stony Point, NY 10980, USA"
}, {
		"location": {
				"latitude": 409146138,
				"longitude": -746188906
		},
		"name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA"
}, {
		"location": {
				"latitude": 404701380,
				"longitude": -744781745
		},
		"name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA"
}, {
		"location": {
				"latitude": 409642566,
				"longitude": -746017679
		},
		"name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA"
}, {
		"location": {
				"latitude": 408031728,
				"longitude": -748645385
		},
		"name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA"
}, {
		"location": {
				"latitude": 413700272,
				"longitude": -742135189
		},
		"name": "367 Prospect Road, Chester, NY 10918, USA"
}, {
		"location": {
				"latitude": 404310607,
				"longitude": -740282632
		},
		"name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA"
}, {
		"location": {
				"latitude": 409319800,
				"longitude": -746201391
		},
		"name": "11 Ward Street, Mount Arlington, NJ 07856, USA"
}, {
		"location": {
				"latitude": 406685311,
				"longitude": -742108603
		},
		"name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA"
}, {
		"location": {
				"latitude": 419018117,
				"longitude": -749142781
		},
		"name": "43 Dreher Road, Roscoe, NY 12776, USA"
}, {
		"location": {
				"latitude": 412856162,
				"longitude": -745148837
		},
		"name": "Swan Street, Pine Island, NY 10969, USA"
}, {
		"location": {
				"latitude": 416560744,
				"longitude": -746721964
		},
		"name": "66 Pleasantview Avenue, Monticello, NY 12701, USA"
}, {
		"location": {
				"latitude": 405314270,
				"longitude": -749836354
		},
		"name": ""
}, {
		"location": {
				"latitude": 414219548,
				"longitude": -743327440
		},
		"name": ""
}, {
		"location": {
				"latitude": 415534177,
				"longitude": -742900616
		},
		"name": "565 Winding Hills Road, Montgomery, NY 12549, USA"
}, {
		"location": {
				"latitude": 406898530,
				"longitude": -749127080
		},
		"name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA"
}, {
		"location": {
				"latitude": 407586880,
				"longitude": -741670168
		},
		"name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA"
}, {
		"location": {
				"latitude": 400106455,
				"longitude": -742870190
		},
		"name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA"
}, {
		"location": {
				"latitude": 400066188,
				"longitude": -746793294
		},
		"name": ""
}, {
		"location": {
				"latitude": 418803880,
				"longitude": -744102673
		},
		"name": "40 Mountain Road, Napanoch, NY 12458, USA"
}, {
		"location": {
				"latitude": 414204288,
				"longitude": -747895140
		},
		"name": ""
}, {
		"location": {
				"latitude": 414777405,
				"longitude": -740615601
		},
		"name": ""
}, {
		"location": {
				"latitude": 415464475,
				"longitude": -747175374
		},
		"name": "48 North Road, Forestburgh, NY 12777, USA"
}, {
		"location": {
				"latitude": 404062378,
				"longitude": -746376177
		},
		"name": ""
}, {
		"location": {
				"latitude": 405688272,
				"longitude": -749285130
		},
		"name": ""
}, {
		"location": {
				"latitude": 400342070,
				"longitude": -748788996
		},
		"name": ""
}, {
		"location": {
				"latitude": 401809022,
				"longitude": -744157964
		},
		"name": ""
}, {
		"location": {
				"latitude": 404226644,
				"longitude": -740517141
		},
		"name": "9 Thompson Avenue, Leonardo, NJ 07737, USA"
}, {
		"location": {
				"latitude": 410322033,
				"longitude": -747871659
		},
		"name": ""
}, {
		"location": {
				"latitude": 407100674,
				"longitude": -747742727
		},
		"name": ""
}, {
		"location": {
				"latitude": 418811433,
				"longitude": -741718005
		},
		"name": "213 Bush Road, Stone Ridge, NY 12484, USA"
}, {
		"location": {
				"latitude": 415034302,
				"longitude": -743850945
		},
		"name": ""
}, {
		"location": {
				"latitude": 411349992,
				"longitude": -743694161
		},
		"name": ""
}, {
		"location": {
				"latitude": 404839914,
				"longitude": -744759616
		},
		"name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA"
}, {
		"location": {
				"latitude": 414638017,
				"longitude": -745957854
		},
		"name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA"
}, {
		"location": {
				"latitude": 412127800,
				"longitude": -740173578
		},
		"name": ""
}, {
		"location": {
				"latitude": 401263460,
				"longitude": -747964303
		},
		"name": ""
}, {
		"location": {
				"latitude": 412843391,
				"longitude": -749086026
		},
		"name": ""
}, {
		"location": {
				"latitude": 418512773,
				"longitude": -743067823
		},
		"name": ""
}, {
		"location": {
				"latitude": 404318328,
				"longitude": -740835638
		},
		"name": "42-102 Main Street, Belford, NJ 07718, USA"
}, {
		"location": {
				"latitude": 419020746,
				"longitude": -741172328
		},
		"name": ""
}, {
		"location": {
				"latitude": 404080723,
				"longitude": -746119569
		},
		"name": ""
}, {
		"location": {
				"latitude": 401012643,
				"longitude": -744035134
		},
		"name": ""
}, {
		"location": {
				"latitude": 404306372,
				"longitude": -741079661
		},
		"name": ""
}, {
		"location": {
				"latitude": 403966326,
				"longitude": -748519297
		},
		"name": ""
}, {
		"location": {
				"latitude": 405002031,
				"longitude": -748407866
		},
		"name": ""
}, {
		"location": {
				"latitude": 409532885,
				"longitude": -742200683
		},
		"name": ""
}, {
		"location": {
				"latitude": 416851321,
				"longitude": -742674555
		},
		"name": ""
}, {
		"location": {
				"latitude": 406411633,
				"longitude": -741722051
		},
		"name": "3387 Richmond Terrace, Staten Island, NY 10303, USA"
}, {
		"location": {
				"latitude": 413069058,
				"longitude": -744597778
		},
		"name": "261 Van Sickle Road, Goshen, NY 10924, USA"
}, {
		"location": {
				"latitude": 418465462,
				"longitude": -746859398
		},
		"name": ""
}, {
		"location": {
				"latitude": 411733222,
				"longitude": -744228360
		},
		"name": ""
}, {
		"location": {
				"latitude": 410248224,
				"longitude": -747127767
		},
		"name": "3 Hasta Way, Newton, NJ 07860, USA"
}]
"""

def read_route_guide_database(): 
	feature_list = []
	for item in json.loads(_jsondb):
		feature = route_guide_pb2.Feature(
				name=item["name"],
				location=route_guide_pb2.Point(
						latitude=item["location"]["latitude"],
						longitude=item["location"]["longitude"]))
		feature_list.append(feature)
	return feature_list

db = read_route_guide_database ()	


if __name__ == "__main__":
	import skitai
	skitai.mount = ("/routeguide.RouteGuide", app)
	skitai.run (
		address = "0.0.0.0",
		port = 30371	
	)
	
