local S = minetest.get_translator("testtools")

minetest.register_entity("testtools:visual_box", {
	initial_properties = {
		visual = "cube",
		textures = {
			"blank.png", "blank.png", "blank.png",
			"blank.png", "blank.png", "blank.png",
		},
		use_texture_alpha = true,
		physical = false,
		pointable = false,
		static_save = false,
	},

	on_activate = function(self)
		self.timestamp = minetest.get_us_time() + 5000000
	end,

	on_step = function(self)
		if minetest.get_us_time() >= self.timestamp then
			self.object:remove()
		end
	end,
})

local BOX_TYPES = {"node_box", "collision_box", "selection_box"}
local DEFAULT_BOX_TYPE = "selection_box"

local function visualizer_on_use(itemstack, user, pointed_thing)
	if pointed_thing.type ~= "node" then
		return
	end

	local meta = itemstack:get_meta()
	local box_type = meta:get("box_type") or DEFAULT_BOX_TYPE

	local result = minetest.get_node_boxes(box_type, pointed_thing.under)
	local t = "testtools_visual_" .. box_type .. ".png"

	for _, box in ipairs(result) do
		local box_min = pointed_thing.under + vector.new(box[1], box[2], box[3])
		local box_max = pointed_thing.under + vector.new(box[4], box[5], box[6])
		local box_center = (box_min + box_max) / 2
		local obj = minetest.add_entity(box_center, "testtools:visual_box")
		if not obj then
			break
		end
		obj:set_properties({
			textures = {t, t, t, t, t, t},
			-- Add a small offset to avoid Z-fighting.
			visual_size = vector.add(box_max - box_min, 0.01),
		})
	end
end

local function visualizer_on_place(itemstack, placer, pointed_thing)
	local meta = itemstack:get_meta()
	local prev_value = meta:get("box_type") or DEFAULT_BOX_TYPE
	local prev_index = table.indexof(BOX_TYPES, prev_value)
	assert(prev_index ~= -1)

	local new_value = BOX_TYPES[(prev_index % #BOX_TYPES) + 1]
	meta:set_string("box_type", new_value)
	minetest.chat_send_player(placer:get_player_name(), S("[Node Box Visualizer] box_type = @1", new_value))

	return itemstack
end

minetest.register_tool("testtools:node_box_visualizer", {
	description = S("Node Box Visualizer") .. "\n" ..
		S("Punch: Show node/collision/selection boxes of the pointed node") .. "\n" ..
		S("Place: Change selected box type (default: selection box)"),
	inventory_image = "testtools_node_box_visualizer.png",
	groups = { testtool = 1, disable_repair = 1 },
	on_use = visualizer_on_use,
	on_place = visualizer_on_place,
	on_secondary_use = visualizer_on_place,
})