local rotate_and_place = minetest.rotate_and_place

local get_node_vars = stairs.util.get_node_vars
local get_stair_images = stairs.util.get_stair_images

local legacy = {}

local nodeboxes = {
	stair = {
		type = "fixed",
		fixed = {
			{ -0.5, -0.5, -0.5, 0.5, 0.0, 0.5 },
			{ -0.5, 0.0, 0.0, 0.5, 0.5, 0.5 },
		},
	},
	slab = {
		type = "fixed",
		fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 },
	},
	stair_inner = {
		type = "fixed",
		fixed = {
			{ -0.5, -0.5, -0.5, 0.5, 0.0, 0.5 },
			{ -0.5, 0.0, 0.0, 0.5, 0.5, 0.5 },
			{ -0.5, 0.0, -0.5, 0.0, 0.5, 0.0 },
		},
	},
	stair_outer = {
		type = "fixed",
		fixed = {
			{ -0.5, -0.5, -0.5, 0.5, 0.0, 0.5 },
			{ -0.5, 0.0, 0.0, 0.0, 0.5, 0.5 },
		},
	},
}

local function register_generic(name, recipeitem, groups, images, description, sounds, worldaligntex, nodebox)
	if not nodebox then
		error()
	end

	local light_source, texture_alpha, sunlight = get_node_vars(recipeitem)

	local stair_images = get_stair_images(images, worldaligntex)

	minetest.register_node(name, {
		description = description,
		drawtype = "nodebox",
		tiles = stair_images,
		use_texture_alpha = texture_alpha,
		sunlight_propagates = sunlight,
		light_source = light_source,
		paramtype = "light",
		paramtype2 = "facedir",
		is_ground_content = false,
		groups = groups,
		sounds = sounds,
		node_box = nodebox,
		on_place = function(itemstack, placer, pointed_thing)
			if pointed_thing.type ~= "node" then
				return itemstack
			end

			return rotate_and_place(itemstack, placer, pointed_thing)
		end,
	})
end

function legacy.register_stair(subname, recipeitem, groups, images, description, sounds, worldaligntex)
	local new_groups = table.copy(groups)
	new_groups.stair = 1

	register_generic(
		":stairs:stair_" .. subname,
		recipeitem,
		new_groups,
		images,
		description,
		sounds,
		worldaligntex,
		nodeboxes.stair
	)

	if recipeitem and minetest.registered_nodes[recipeitem] then
		-- Recipe matches appearence in inventory
		minetest.register_craft({
			output = "stairs:stair_" .. subname .. " 8",
			recipe = {
				{ "", "", recipeitem },
				{ "", recipeitem, recipeitem },
				{ recipeitem, recipeitem, recipeitem },
			},
		})

		-- Use stairs to craft full blocks again (1:1)
		minetest.register_craft({
			output = recipeitem .. " 3",
			recipe = {
				{ "stairs:stair_" .. subname, "stairs:stair_" .. subname },
				{ "stairs:stair_" .. subname, "stairs:stair_" .. subname },
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = { recipeitem },
		}).time

		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:stair_" .. subname,
				burntime = math.floor(baseburntime * 0.75),
			})
		end
	end
end

-- Register slab
-- Node will be called stairs:slab_<subname>

function legacy.register_slab(subname, recipeitem, groups, images, description, sounds, worldaligntex)
	local new_groups = table.copy(groups)
	new_groups.slab = 1

	register_generic(
		":stairs:slab_" .. subname,
		recipeitem,
		new_groups,
		images,
		description,
		sounds,
		worldaligntex,
		nodeboxes.slab
	)

	if recipeitem and minetest.registered_nodes[recipeitem] then
		minetest.register_craft({
			output = "stairs:slab_" .. subname .. " 6",
			recipe = {
				{ recipeitem, recipeitem, recipeitem },
			},
		})

		-- Use 2 slabs to craft a full block again (1:1)
		minetest.register_craft({
			output = recipeitem,
			recipe = {
				{ "stairs:slab_" .. subname },
				{ "stairs:slab_" .. subname },
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = { recipeitem },
		}).time
		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:slab_" .. subname,
				burntime = math.floor(baseburntime * 0.5),
			})
		end
	end
end

-- Register inner stair
-- Node will be called stairs:stair_inner_<subname>

function legacy.register_stair_inner(
	subname,
	recipeitem,
	groups,
	images,
	description,
	sounds,
	worldaligntex,
	full_description
)
	local new_groups = table.copy(groups)
	new_groups.stair = 1
	if full_description then
		description = full_description
	else
		description = stairs.S("Inner ") .. description
	end

	register_generic(
		":stairs:stair_inner_" .. subname,
		recipeitem,
		new_groups,
		images,
		description,
		sounds,
		worldaligntex,
		nodeboxes.stair_inner
	)

	if recipeitem and minetest.registered_nodes[recipeitem] then
		minetest.register_craft({
			output = "stairs:stair_inner_" .. subname .. " 7",
			recipe = {
				{ "", recipeitem, "" },
				{ recipeitem, "", recipeitem },
				{ recipeitem, recipeitem, recipeitem },
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = { recipeitem },
		}).time

		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:stair_inner_" .. subname,
				burntime = math.floor(baseburntime * 0.875),
			})
		end
	end
end

-- Register outer stair
-- Node will be called stairs:stair_outer_<subname>

function legacy.register_stair_outer(
	subname,
	recipeitem,
	groups,
	images,
	description,
	sounds,
	worldaligntex,
	full_description
)
	local new_groups = table.copy(groups)
	new_groups.stair = 1

	if full_description then
		description = full_description
	else
		description = stairs.S("Outer ") .. description
	end

	register_generic(
		":stairs:stair_outer_" .. subname,
		recipeitem,
		new_groups,
		images,
		description,
		sounds,
		worldaligntex,
		nodeboxes.stair_outer
	)

	if recipeitem and minetest.registered_nodes[recipeitem] then
		minetest.register_craft({
			output = "stairs:stair_outer_" .. subname .. " 6",
			recipe = {
				{ "", recipeitem, "" },
				{ recipeitem, recipeitem, recipeitem },
			},
		})

		-- Fuel
		local baseburntime = minetest.get_craft_result({
			method = "fuel",
			width = 1,
			items = { recipeitem },
		}).time

		if baseburntime > 0 then
			minetest.register_craft({
				type = "fuel",
				recipe = "stairs:stair_outer_" .. subname,
				burntime = math.floor(baseburntime * 0.625),
			})
		end
	end
end

stairs.legacy = legacy
