local wea = worldeditadditions
local wea_c = worldeditadditions_core
wea.erode = {}

dofile(wea.modpath.."/lib/erode/snowballs.lua")
dofile(wea.modpath.."/lib/erode/river.lua")


function wea.erode.run(pos1, pos2, algorithm, params)
	pos1, pos2 = worldedit.sort_pos(pos1, pos2)
	
	local manip, area = worldedit.manip_helpers.init(pos1, pos2)
	local data = manip:get_data()
	
	local heightmap_size = {
		z = (pos2.z - pos1.z) + 1,
		x = (pos2.x - pos1.x) + 1
	}
	
	local region_height = (pos2.y - pos1.y) + 1
	
	local heightmap = wea_c.terrain.make_heightmap(pos1, pos2, manip, area, data)
	local heightmap_eroded = wea_c.table.shallowcopy(heightmap)
	
	-- print("[erode.run] algorithm: "..algorithm..", params:");
	-- print(wea_c.format.map(params))
	-- wea_c.format.array_2d(heightmap, heightmap_size.x)
	local success, msg, stats
	if algorithm == "snowballs" then
		success, msg = wea.erode.snowballs(
			heightmap, heightmap_eroded,
			heightmap_size,
			region_height,
			params
		)
		if not success then return success, msg end
	elseif algorithm == "river" then
		success, msg = wea.erode.river(
			heightmap, heightmap_eroded,
			heightmap_size,
			region_height,
			params
		)
		if not success then return success, msg end
	else
		-- FUTURE: Add a new "river" algorithm here that:
		-- * Fills in blocks that are surrounded on more than 3 horizontal sides
		-- * Destroys blocks that have no horizontal neighbours
		-- A bit like cellular automata actually.
		return false, "Error: Unknown algorithm '"..algorithm.."'. Currently implemented algorithms: snowballs (2d; hydraulic-like), river (2d; cellular automata-like; fills potholes and lowers towers). Ideas for algorithms to implement are welcome!"
	end
	
	success, stats = wea_c.terrain.apply_heightmap_changes(
		pos1, pos2, area, data,
		heightmap, heightmap_eroded, heightmap_size
	)
	if not success then return success, stats end
	worldedit.manip_helpers.finish(manip, data)
	
	return true, msg, stats
end
