local S = core.get_translator(cleaner.modname)


--- Cleans duplicate entries from indexed table.
--
--  @local
--  @function clean_duplicates
--  @tparam table t
--  @treturn table
local function clean_duplicates(t)
	local tmp = {}
	for _, v in ipairs(t) do
		tmp[v] = true
	end

	t = {}
	for k in pairs(tmp) do
		table.insert(t, k)
	end

	return t
end

local world_file = core.get_worldpath() .. "/cleaner.json"

local function get_world_data()
	local wdata = {}
	local buffer = io.open(world_file, "r")
	if buffer then
		wdata = core.parse_json(buffer:read("*a"))
		buffer:close()
	end

	local rem_types = {"entities", "nodes", "ores",}
	local rep_types = {"items", "nodes",}

	for _, t in ipairs(rem_types) do
		wdata[t] = wdata[t] or {}
		wdata[t].remove = wdata[t].remove or {}
	end

	for _, t in ipairs(rep_types) do
		wdata[t] = wdata[t] or {}
		wdata[t].replace = wdata[t].replace or {}
	end

	return wdata
end

local function update_world_data(t, data)
	local wdata = get_world_data()
	if t and data then
		wdata[t].remove = data.remove
		wdata[t].replace = data.replace
	end

	local json_string = core.write_json(wdata, true):gsub("\"remove\" : null", "\"remove\" : []")
		:gsub("\"replace\" : null", "\"replace\" : {}")

	local buffer = io.open(world_file, "w")
	if buffer then
		buffer:write(json_string)
		buffer:close()

		return true
	end

	return false
end

local tool = {
	modes = {
		erase = true,
		write = true,
		swap = true,
	},
}

tool.set_mode = function(self, stack, mode, pname)
	local iname = stack:get_name()

	if not self.modes[mode] then
		if pname then
			core.chat_send_player(pname, iname .. ": " .. S("unknown mode: @1", mode))
		end
		cleaner.log("warning", iname .. ": unknown mode: " .. mode)
		return stack
	end

	--[[ FIXME: want to flip item image when mode is set to "erase"
	local new_item = table.copy(core.registered_nodes[iname])
	if mode == "erase" then
		new_item.inventory_image = "cleaner_pencil.png^[transformFXFY"
	else
		new_item.inventory_image = "cleaner_pencil.png"
	end

	local new_stack = ItemStack(new_item)
	]]

	local imeta = stack:get_meta()
	imeta:set_string("mode", mode)

	if pname then
		core.chat_send_player(pname, iname .. ": "
			.. S("mode set to: @1", imeta:get_string("mode")))
	end

	return stack
end

tool.set_node = function(self, stack, node, pname)
	local imeta = stack:get_meta()
	imeta:set_string("node", node)

	if pname then
		core.chat_send_player(pname, stack:get_name() .. ": "
			.. S("node set to: @1", imeta:get_string("node")))
	end

	return stack
end


return {
	clean_duplicates = clean_duplicates,
	get_world_data = get_world_data,
	update_world_data = update_world_data,
	tool = tool,
}