--[[
	This function registers the nodes and craft rezieps for the reinforce stuff
	 * name: String which is used in description and as technical name (lower letters)
	 * craftItem: the Item where the reinforce is crafted out of
	 * nodedef: Nodedefinition table as used as in minetest.register_node()

	The Nodes are caled
	<modname>:reinforced_<name>
	<modname>:reinforced_<name>_slope
	<modname>:reinforced_<name>_arrow
	<modname>:reinforced_<name>_bars

	The modname is automatically the mod that currently calls this function. 
	e.g. if you call darkage.register_reinforce from the mod medieval modname will be medieval
]]
function darkage.register_reinforce(name, craftItem, nodedef)
	assert(type(nodedef.tiles)=="table","ERRROR: nodedef.tiles have to be a table")
	assert(nodedef.tiles[1], "ERROR: "..dump(nodedef.tiles).." requires at least 1 entry")

	if nodedef.groups then
		nodedef.groups["not_cuttable"] = 1;
	else 
		nodedef.groups = {};
		nodedef.groups["not_cuttable"] = 1;
	end

	local modname = minetest.get_current_modname();
	local tname = string.gsub(name:lower()," ", "_"); -- Technical name

-- Reinforced X
	local reinforced = table.copy(nodedef);
	local reinforced_tname = modname..":reinforced_"..tname
	reinforced.description = "Reinforced "..name
	for i,tile in ipairs(reinforced.tiles) do
		reinforced.tiles[i] = tile .."^darkage_reinforce.png"
	end

	minetest.register_node(reinforced_tname, reinforced)

	minetest.register_craft({
		output = reinforced_tname,
		recipe = {
			{"group:stick",	craftItem, 		"group:stick"},
			{craftItem,		"group:stick", 	craftItem},
			{"group:stick",	craftItem, 		"group:stick"},
		}
	})
	-- Recycling
	minetest.register_craft({
		output = craftItem,
		recipe = {
			{ reinforced_tname },
		}
	})

-- Reinforced Slope
	local slope = table.copy(nodedef);
	local slope_tname = modname..":reinforced_"..tname.."_slope"
	slope.description = "Reinforced "..name.." Slope\nHint: use the screwdriver to rotate."
	slope.paramtype2 = "facedir";
	local slope_tile_extend = {"^darkage_reinforce_right.png" , "^darkage_reinforce_right.png" , --top ,down
			"^darkage_reinforce_right.png" , "^darkage_reinforce_right.png" , --right, left
			"^darkage_reinforce_left.png" , "^darkage_reinforce_left.png"} -- front, back
	for i=1,6 do
		local tile = slope.tiles[i] or nodedef.tiles[1]; -- There have to be at least one tile.
		slope.tiles[i] = tile ..slope_tile_extend[i]	
	end

	minetest.register_node(slope_tname, slope)

	minetest.register_craft({
		output = slope_tname,
		recipe = {
			{craftItem,		craftItem,		"group:stick"},
			{craftItem,		"group:stick",	craftItem},
			{"group:stick",	craftItem,		craftItem},
		}
	})
	-- Flipped recipe
	minetest.register_craft({
		output = slope_tname,
		recipe = {
			{"group:stick",	craftItem,		craftItem},
			{craftItem,		"group:stick",	craftItem},
			{craftItem,		craftItem,		"group:stick"},
		}
	})
	-- Recycling
	minetest.register_craft({
		output = craftItem,
		recipe = {
			{ slope_tname }
		}
	})

	-- Alias to convert old nodes
	minetest.register_alias(modname..":reinforced_"..tname.."_right", slope_tname)
	minetest.register_alias(modname..":reinforced_"..tname.."_left", slope_tname)

-- Arrow bar
	local arrow = table.copy(nodedef)
	local arrow_tname = modname..":reinforced_"..tname.."_arrow"
	arrow.paramtype2 = "facedir";
	arrow.description = "Reinforced "..name.." Arrow \nHint: use the screwdriver to rotate."
	local arrow_tile_extend = {"" , "" , --top ,down
			"^(darkage_reinforce_arrow.png^[transformR90)" , "^(darkage_reinforce_arrow.png^[transformR270)" , --right, left
			"^(darkage_reinforce_arrow.png^[transformR180)" , "^darkage_reinforce_arrow.png"} -- front, back
	for i=1,6 do
		local tile = arrow.tiles[i] or arrow.tiles[1]; -- There have to be at least one tile.
		arrow.tiles[i] = tile .. arrow_tile_extend[i]
	end
	minetest.register_node(arrow_tname, arrow)

	minetest.register_craft({
		output = arrow_tname,
		recipe = {
			{craftItem, 	"group:stick",	craftItem},
			{"group:stick",	 craftItem, 	"group:stick"},
			{"group:stick",	 craftItem, 	"group:stick"},
		}
	})
	-- Recycling
	minetest.register_craft({
		output = craftItem,
		recipe = {
			{ arrow_tname }
		}
	})

-- Reinforced Bars
	local bars = table.copy(nodedef)
	local bars_tname = modname..":reinforced_"..tname.."_bars"
	bars.description = name.." Bars"
	for i,tile in ipairs(bars.tiles) do
		bars.tiles[i] = tile .."^darkage_reinforce_bars.png"
	end
	minetest.register_node(bars_tname, bars)

	minetest.register_craft({
		output = bars_tname,
		recipe = {
			{"group:stick", craftItem, "group:stick"},
			{"group:stick", craftItem, "group:stick"},
			{"group:stick", craftItem, "group:stick"},
		}
	})
	minetest.register_craft({
		output = craftItem,
		recipe = {
			{ bars_tname }
		}
	})
end

darkage.register_reinforce("Chalk", "darkage:chalk_powder", {
	tiles = {"darkage_chalk.png"},
	groups = {cracky=3},
	sounds = default.node_sound_stone_defaults()
})

darkage.register_reinforce("Wood", "default:wood", {
	tiles = {"default_wood.png"},
	groups = {snappy=2, choppy=3, flammable=3},
	sounds = default.node_sound_wood_defaults()
})

darkage.register_reinforce("Chalked Bricks", "darkage:chalked_bricks", {
	tiles = {"darkage_chalked_bricks.png"},
	groups = {cracky = 2, stone = 1},
	sounds = default.node_sound_stone_defaults()
})
