-- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off
-- The conditions in brackets define whether there is a mesecon at that place or not
-- 1 = there is one; 0 = there is none
-- y always means y+

box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/64, 1/16}
box_bump1 =  { -2/16, -.5,  -2/16, 2/16, -.5+1/64, 2/16 }

box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/64, 1/16}
box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/64, 8/16}
box_xm = {-8/16, -.5, -1/16, -1/16, -.5+1/64, 1/16}
box_zm = {-1/16, -.5, -8/16, 1/16, -.5+1/64, -1/16}

box_xpy = {.5-1/16, -.5+1/64, -1/16, .5, .4999+1/64, 1/16}
box_zpy = {-1/16, -.5+1/64, .5-1/16, 1/16, .4999+1/64, .5}
box_xmy = {-.5, -.5+1/64, -1/16, -.5+1/16, .4999+1/64, 1/16}
box_zmy = {-1/16, -.5+1/64, -.5, 1/16, .4999+1/64, -.5+1/16}

-- Registering the wires

for xp=0, 1 do
for zp=0, 1 do
for xm=0, 1 do
for zm=0, 1 do
for xpy=0, 1 do
for zpy=0, 1 do
for xmy=0, 1 do
for zmy=0, 1 do
	if (xpy == 1 and xp == 0) or (zpy == 1 and zp == 0) 
	or (xmy == 1 and xm == 0) or (zmy == 1 and zm == 0) then break end

	local groups
	local nodeid = 	tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm )..
			tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)

	local wirehelp
	local longdesc
	local usagehelp
	if nodeid == "00000000" then
		groups = {dig_immediate = 3, mesecon_conductor_craftable = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1}
		wiredesc = "Redstone"
		wirehelp = nodeid == "00000000"
		if wirehelp then
			longdesc = [[Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on trail the ground as a trail.
A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.
Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.]]
			usagehelp = [[Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.

Read the help entries on the other redstone components to learn how redstone components interact.]]
		end
	else
		groups = {dig_immediate = 3, not_in_creative_inventory = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1}
		wiredesc = "Redstone Trail (ID: "..nodeid..")"
		wirehelp = false
	end

	local nodebox = {}
	local adjx = false
	local adjz = false
	if xp == 1 then table.insert(nodebox, box_xp) adjx = true end
	if zp == 1 then table.insert(nodebox, box_zp) adjz = true end
	if xm == 1 then table.insert(nodebox, box_xm) adjx = true end
	if zm == 1 then table.insert(nodebox, box_zm) adjz = true end
	if xpy == 1 then table.insert(nodebox, box_xpy) end
	if zpy == 1 then table.insert(nodebox, box_zpy) end
	if xmy == 1 then table.insert(nodebox, box_xmy) end
	if zmy == 1 then table.insert(nodebox, box_zmy) end

	if adjx and adjz and (xp + zp + xm + zm > 2) then
		table.insert(nodebox, box_bump1)
		tiles_off = {
			"jeija_mesecon_crossing_off.png",
			"jeija_mesecon_crossing_off.png",
			"jeija_mesecon_off.png",
			"jeija_mesecon_off.png",
			"jeija_mesecon_off.png",
			"jeija_mesecon_off.png"
		}
		tiles_on = {
			"jeija_mesecon_crossing_on.png",
			"jeija_mesecon_crossing_on.png",
			"jeija_mesecon_on.png",
			"jeija_mesecon_on.png",
			"jeija_mesecon_on.png",
			"jeija_mesecon_on.png"
		}
	else
		table.insert(nodebox, box_center)
		tiles_off = {
			"jeija_mesecon_crossing_off.png",
			"jeija_mesecon_crossing_off.png",
			"jeija_mesecon_off.png",
			"jeija_mesecon_off.png",
			"jeija_mesecon_off.png",
			"jeija_mesecon_off.png"
		}
		tiles_on = {
			"jeija_mesecon_crossing_on.png",
			"jeija_mesecon_crossing_on.png",
			"jeija_mesecon_on.png",
			"jeija_mesecon_on.png",
			"jeija_mesecon_on.png",
			"jeija_mesecon_on.png"
		}
	end

	if nodeid == "00000000" then
		nodebox = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}
	end

	minetest.register_node("mesecons:wire_"..nodeid.."_off", {
		description = "Redstone",
		_doc_items_create_entry = wirehelp,
		_doc_items_longdesc = longdesc,
		_doc_items_usagehelp = usagehelp,
		drawtype = "nodebox",
		tiles = tiles_off,
		is_ground_content = false,
--		inventory_image = "wires_inv.png",
--		wield_image = "wires_inv.png",
		inventory_image = "redstone_redstone_dust.png",
		wield_image = "redstone_redstone_dust.png",
		paramtype = "light",
		paramtype2 = "facedir",
		sunlight_propagates = true,
		selection_box = {
              		type = "fixed",
			fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5}
		},
		node_box = {
			type = "fixed",
			fixed = nodebox
		},
		groups = groups,
		walkable = false,
		stack_max = 64,
		drop = "mesecons:wire_00000000_off",
		mesecons = {conductor={
			state = mesecon.state.off,
			onstate = "mesecons:wire_"..nodeid.."_on"
		}},
		sounds = mcl_sounds.node_sound_defaults(),
	})

	minetest.register_node("mesecons:wire_"..nodeid.."_on", {
		description = "Redstone (Powered)",
		_doc_items_create_entry = false,
		drawtype = "nodebox",
		tiles = tiles_on,
		is_ground_content = false,
--		inventory_image = "wires_inv.png",
--		wield_image = "wires_inv.png",
		inventory_image = "redstone_redstone_dust.png",
		wield_image = "redstone_redstone_dust.png",
		paramtype = "light",
		paramtype2 = "facedir",
		sunlight_propagates = true,
		selection_box = {
              		type = "fixed",
			fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5}
		},
		node_box = {
			type = "fixed",
			fixed = nodebox
		},
		groups = {dig_immediate = 3, mesecon = 2, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, attached_node = 1, not_in_creative_inventory = 1},
		walkable = false,
		stack_max = 64,
		drop = "mesecons:wire_00000000_off",
		mesecons = {conductor={
			state = mesecon.state.on,
			offstate = "mesecons:wire_"..nodeid.."_off"
		}},
		sounds = mcl_sounds.node_sound_defaults(),
	})

	-- Add Help entry aliases for e.g. making it identifiable by the lookup tool [doc_identifier]
	if minetest.get_modpath("doc") then
		if nodeid ~= "00000000" then
			doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_off")
		end
		doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_on")
	end
end
end
end
end
end
end
end
end

-- Updating the wires:
-- Place the right connection wire

local update_on_place_dig = function (pos, node)
	if minetest.registered_nodes[node.name]
	and minetest.registered_nodes[node.name].mesecons then
		mesecon:update_autoconnect(pos)
	end
end

minetest.register_on_placenode(update_on_place_dig)
minetest.register_on_dignode(update_on_place_dig)

function mesecon:update_autoconnect(pos, secondcall, replace_old)
	local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
	local zppos = {x=pos.x, y=pos.y, z=pos.z+1}
	local xmpos = {x=pos.x-1, y=pos.y, z=pos.z}
	local zmpos = {x=pos.x, y=pos.y, z=pos.z-1}

	local xpympos = {x=pos.x+1, y=pos.y-1, z=pos.z}
	local zpympos = {x=pos.x, y=pos.y-1, z=pos.z+1}
	local xmympos = {x=pos.x-1, y=pos.y-1, z=pos.z}
	local zmympos = {x=pos.x, y=pos.y-1, z=pos.z-1}

	local xpypos = {x=pos.x+1, y=pos.y+1, z=pos.z}
	local zpypos = {x=pos.x, y=pos.y+1, z=pos.z+1}
	local xmypos = {x=pos.x-1, y=pos.y+1, z=pos.z}
	local zmypos = {x=pos.x, y=pos.y+1, z=pos.z-1}

	if secondcall == nil then
		mesecon:update_autoconnect(xppos, true)
		mesecon:update_autoconnect(zppos, true)
		mesecon:update_autoconnect(xmpos, true)
		mesecon:update_autoconnect(zmpos, true)

		mesecon:update_autoconnect(xpypos, true)
		mesecon:update_autoconnect(zpypos, true)
		mesecon:update_autoconnect(xmypos, true)
		mesecon:update_autoconnect(zmypos, true)

		mesecon:update_autoconnect(xpympos, true)
		mesecon:update_autoconnect(zpympos, true)
		mesecon:update_autoconnect(xmympos, true)
		mesecon:update_autoconnect(zmympos, true)
	end

	local nodename = minetest.get_node(pos).name
	if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end

	if mesecon:rules_link_anydir(pos, xppos) then xp = 1 else xp = 0 end
	if mesecon:rules_link_anydir(pos, xmpos) then xm = 1 else xm = 0 end
	if mesecon:rules_link_anydir(pos, zppos) then zp = 1 else zp = 0 end
	if mesecon:rules_link_anydir(pos, zmpos) then zm = 1 else zm = 0 end

	if mesecon:rules_link_anydir(pos, xpympos) then xp = 1 end
	if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end
	if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end
	if mesecon:rules_link_anydir(pos, zmympos) then zm = 1 end

	if mesecon:rules_link_anydir(pos, xpypos) then xpy = 1 else xpy = 0 end
	if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end
	if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end
	if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end

	if xpy == 1 then xp = 1 end
	if zpy == 1 then zp = 1 end
	if xmy == 1 then xm = 1 end
	if zmy == 1 then zm = 1 end

	local nodeid = 	tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm )..
			tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)

	
	if string.find(nodename, "_off") ~= nil then
		minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_off"})
	else
		minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_on" })
	end
end

minetest.register_alias("mesecons:redstone", "mesecons:wire_00000000_off")

minetest.register_craft({
	type = "cooking",
	output = "mesecons:redstone",
	recipe = "mcl_core:stone_with_redstone",
	cooktime = 10,
})