# Copyright (c) 2020, JINGROW
# License: MIT. See LICENSE

import jingrow


@jingrow.whitelist()
def get_coords(pagetype, filters, type):
	"""Get a geojson dict representing a pagetype."""
	filters_sql = get_coords_conditions(pagetype, filters)[4:]

	coords = None
	if type == "location_field":
		coords = return_location(pagetype, filters_sql)
	elif type == "coordinates":
		coords = return_coordinates(pagetype, filters_sql)

	return convert_to_geojson(type, coords)


def convert_to_geojson(type, coords):
	"""Converts GPS coordinates to geoJSON string."""
	geojson = {"type": "FeatureCollection", "features": None}

	if type == "location_field":
		geojson["features"] = merge_location_features_in_one(coords)
	elif type == "coordinates":
		geojson["features"] = create_gps_markers(coords)

	return geojson


def merge_location_features_in_one(coords):
	"""Merging all features from location field."""
	geojson_dict = []
	for element in coords:
		geojson_loc = jingrow.parse_json(element["location"])
		if not geojson_loc:
			continue
		for coord in geojson_loc["features"]:
			coord["properties"]["name"] = element["name"]
			geojson_dict.append(coord.copy())

	return geojson_dict


def create_gps_markers(coords):
	"""Build Marker based on latitude and longitude."""
	geojson_dict = []
	for i in coords:
		node = {"type": "Feature", "properties": {}, "geometry": {"type": "Point", "coordinates": None}}
		node["properties"]["name"] = i.name
		node["geometry"]["coordinates"] = [i.longitude, i.latitude]  # geojson needs it reverse!
		geojson_dict.append(node.copy())

	return geojson_dict


def return_location(pagetype, filters_sql):
	"""Get name and location fields for Pagetype."""
	if filters_sql:
		try:
			coords = jingrow.db.sql(
				f"""SELECT name, location FROM `tab{pagetype}`  WHERE {filters_sql}""", as_dict=True
			)
		except jingrow.db.InternalError:
			jingrow.msgprint(jingrow._("This Pagetype does not contain location fields"), raise_exception=True)
			return
	else:
		coords = jingrow.get_all(pagetype, fields=["name", "location"])
	return coords


def return_coordinates(pagetype, filters_sql):
	"""Get name, latitude and longitude fields for Pagetype."""
	if filters_sql:
		try:
			coords = jingrow.db.sql(
				f"""SELECT name, latitude, longitude FROM `tab{pagetype}`  WHERE {filters_sql}""",
				as_dict=True,
			)
		except jingrow.db.InternalError:
			jingrow.msgprint(
				jingrow._("This Pagetype does not contain latitude and longitude fields"), raise_exception=True
			)
			return
	else:
		coords = jingrow.get_all(pagetype, fields=["name", "latitude", "longitude"])
	return coords


def get_coords_conditions(pagetype, filters=None):
	"""Returns SQL conditions with user permissions and filters for event queries."""
	from jingrow.desk.reportview import get_filters_cond

	if not jingrow.has_permission(pagetype):
		jingrow.throw(jingrow._("Not Permitted"), jingrow.PermissionError)

	return get_filters_cond(pagetype, filters, [], with_match_conditions=True)
