@tool
extends EditorScenePostImport

# Output structure
# {{Tile Name}} : MeshInstance3D
#	- StaticBody3D : StaticBody3D
#		- {{Tile Name}} Collision Mesh : CollisionShape3D
#	- NavigationRegion3D : NavigationRegion3D
#		- {{Tile Name}} Nav Mesh : MeshInstance3D

func _post_import(scene: Node) -> Object:
	print_rich("[b]Starting Import![/b]")
	
	var tiles_to_edit: Array[MeshInstance3D] = get_visual_tiles(scene)
	
	edit_scene(scene, tiles_to_edit)
	
	var timestamp_node: Node = Node.new()
	timestamp_node.name = Time.get_time_string_from_system().replacen(":", "-")
	scene.add_child(timestamp_node)
	timestamp_node.set_owner(scene)
	
	return scene

func get_visual_tiles(scene: Node) -> Array[MeshInstance3D]:
	var tiles: Array[MeshInstance3D] = []
	# Avoids editing tree while parsing
	for child in scene.get_children():
		if child.name.ends_with("Nav") || child.name.ends_with("Collision"): continue
		tiles.push_back(child as MeshInstance3D)
	return tiles

func edit_scene(scene: Node, tiles: Array[MeshInstance3D]) -> void:
	# Assumes specific names for Colliison / Nav meshes
	for tile in tiles:
		print("Editing %s" % [tile.name])
		var collision = scene.find_child("%s Collision" % tile.name)
		var nav = scene.find_child("%s Nav" % tile.name)
		
		# Helpful? warnings
		if collision == null:
			push_warning("Missing '%s Collision'" % tile.name)
		if nav == null:
			push_warning("Missing '%s Nav'" % tile.name)
		
		collision.set_owner(null)
		collision.reparent(tile)
		collision.set_owner(scene)
		
		#print("- Adding NavigationMesh")
		var nav_mesh: NavigationMesh = NavigationMesh.new()
		nav_mesh.sample_partition_type = NavigationMesh.SAMPLE_PARTITION_LAYERS
		nav_mesh.agent_radius = 0.2
		nav_mesh.region_min_size = 1.0
		nav_mesh.agent_max_slope = 46.0
		nav_mesh.filter_walkable_low_height_spans = true
		
		#print("- Adding NavigationRegion3D")
		var nav_region: NavigationRegion3D = NavigationRegion3D.new()
		nav_region.name = "NavigationRegion3D"
		tile.add_child(nav_region)
		nav_region.set_owner(scene)
		nav_region.navigation_mesh = nav_mesh
		nav_region.bake_navigation_mesh(false)
		
		#print("- Reparenting Navigation MeshInstance3D")
		nav.set_owner(null)
		nav.reparent(nav_region)
		nav.set_owner(scene)
	#endfor
	
	print_rich("[b]Done![/b]")