local c_dirt_with_grass      = minetest.get_content_id("mcl_core:dirt_with_grass")
local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow")
local c_top_snow             = minetest.get_content_id("mcl_core:snow")
local c_snow_block           = minetest.get_content_id("mcl_core:snowblock")

mcl_mapgen.register_on_generated(function(vm_context)
	local minp, maxp = vm_context.minp, vm_context.maxp
	local min_y, max_y = minp.y, maxp.y
	if min_y > mcl_mapgen.overworld.max or max_y < mcl_mapgen.overworld.min then return end

	vm_context.param2_data = vm_context.param2_data or vm:get_param2_data(vm_context.lvm_param2_buffer)
	vm_context.biomemap    = vm_context.biomemap or minetest.get_mapgen_object("biomemap")
	local param2_data      = vm_context.param2_data
	local biomemap         = vm_context.biomemap
	local vm, data, area   = vm_context.vm, vm_context.data, vm_context.area

	local min_x, min_z = minp.x, minp.z
	local chunksize = max_y - min_y + 1

	----- Interactive block fixing section -----
	----- The section to perform basic block overrides of the core mapgen generated world. -----

	-- Snow and sand fixes. This code implements snow consistency
	-- and fixes floating sand and cut plants.
	-- A snowy grass block must be below a top snow or snow block at all times.

	-- Set param2 (=color) of grass blocks.
	-- Clear snowy grass blocks without snow above to ensure consistency.
	local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"})

	for n=1, #nodes do
		local pos = nodes[n]
		local x, y, z = pos.x, pos.y, pos.z
		local p_pos = area:index(x, y, z)
		local p_pos_above = area:index(x, y + 1, z)
		local biomemap_offset = (z - min_z) * chunksize + x - min_x + 1
		local biome_id = biomemap[biomemap_offset]
		local biome_name = minetest.get_biome_name(biome_id)
		if biome_name then
			local biome = minetest.registered_biomes[biome_name]
			if biome and biome._mcl_biome_type then
				param2_data[p_pos] = biome._mcl_palette_index
				vm_context.write_param2 = true
			end
		end
		if data[p_pos] == c_dirt_with_grass_snow and p_pos_above and data[p_pos_above] ~= c_top_snow and data[p_pos_above] ~= c_snow_block then
			data[p_pos] = c_dirt_with_grass
			vm_context.write = true
		end
	end
end, 999999999)
