-- This file supplies refrigerators

local S = homedecor.gettext

-- nodebox models

local fridge_model_bottom = {
	type = "fixed",
	fixed = {
		{0, -0.4375, -0.4375, 0.5, 0.5, 0.5}, -- NodeBox1
		{-0.5, -0.5, -0.42, 0.5, 0.5, 0.5}, -- NodeBox2
		{-0.5, -0.4375, -0.4375, -0.0625, 0.5, 0.5}, -- NodeBox3
		{0, 0.25, -0.5, 0.0625, 0.3125, -0.4375}, -- NodeBox4
		{-0.125, 0.25, -0.5, -0.0625, 0.3125, -0.4375}, -- NodeBox5
		{0, 0.25, -0.5, 0.0625, 0.5, -0.473029}, -- NodeBox6
		{-0.125, 0.25, -0.5, -0.0625, 0.5, -0.473029}, -- NodeBox7
	}
}

local fridge_model_top = {
	type = "fixed",
	fixed = {
		{0, -0.5, -0.4375, 0.5, 0.5, 0.5}, -- NodeBox1
		{-0.0625, -0.5, -0.42, 0, 0.5, 0.5}, -- NodeBox2
		{-0.5, -0.5, -0.4375, -0.0625, -0.4375, 0.5}, -- NodeBox3
		{-0.5, -0.5, -0.4375, -0.4375, 0.5, 0.5}, -- NodeBox4
		{-0.5, -0.1875, -0.4375, -0.0625, 0.5, 0.5}, -- NodeBox5
		{-0.4375, -0.4375, -0.125, -0.0625, -0.1875, 0.5}, -- NodeBox6
		{-0.125, -0.4375, -0.4375, -0.0625, -0.1875, -0.125}, -- NodeBox7
		{-0.3125, -0.3125, -0.307054, -0.25, -0.1875, -0.286307}, -- NodeBox8
		{-0.125, 0, -0.5, -0.0625, 0.0625, -0.4375}, -- NodeBox9
		{0, 0, -0.5, 0.0625, 0.0625, -0.4375}, -- NodeBox10
		{0, -0.5, -0.5, 0.0625, 0.0625, -0.473029}, -- NodeBox11
		{-0.125, -0.5, -0.5, -0.0625, 0.0625, -0.473029}, -- NodeBox12
	}
}

-- steel-textured fridge

minetest.register_node("homedecor:refrigerator_steel_bottom", {
	tiles = {
		"default_steel_block.png",
		"homedecor_refrigerator_steel_bottom.png",
		"homedecor_refrigerator_steel_sides2.png",
		"homedecor_refrigerator_steel_sides2.png^[transformFX",
		"homedecor_refrigerator_steel_back2.png",
		"homedecor_refrigerator_steel_front2.png"
	},
	inventory_image = "homedecor_refrigerator_steel_inv.png",
    description = S("Refrigerator (stainless steel)"),
	drawtype = "nodebox",
	paramtype = "light",
    paramtype2 = "facedir",
    groups = {snappy=3},
	node_box = fridge_model_bottom,
	selection_box = {
		type = "fixed",
		fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }
	},
	on_place = function(itemstack, placer, pointed_thing)
		local pos = pointed_thing.under
		local pnode = minetest.get_node(pointed_thing.under)
		local rnodedef = minetest.registered_nodes[pnode.name]

		if not rnodedef["buildable_to"] then
			pos = pointed_thing.above
		end

		local fdir = minetest.dir_to_facedir(placer:get_look_dir())
		local pos2 = { x = pos.x, y=pos.y + 1, z = pos.z }

		local tnode = minetest.get_node(pos)
		local tnode2 = minetest.get_node(pos2)

		if homedecor.get_nodedef_field(tnode.name, "buildable_to")
		  and homedecor.get_nodedef_field(tnode2.name, "buildable_to")
		  and not minetest.is_protected(pos, placer:get_player_name())
		  and not minetest.is_protected(pos2, placer:get_player_name()) then
			local nodename = itemstack:get_name()
			minetest.add_node(pos, { name = nodename, param2 = fdir })
			minetest.add_node(pos2, { name = "homedecor:refrigerator_steel_top", param2 = fdir })

			if string.find(nodename, "_locked") then
		        local meta = minetest.get_meta(pos)
				meta:set_string("owner", placer:get_player_name() or "")
				meta:set_string("infotext", S("Locked Refrigerator (owned by %s)"):format(meta:get_string("owner")))
			end

			if not homedecor.expect_infinite_stacks then
				itemstack:take_item()
				return itemstack
			end
		end
	end,
	after_dig_node = function(pos, oldnode, oldmetadata, digger)
		local pos2 = { x = pos.x, y=pos.y + 1, z = pos.z }
		if minetest.get_node(pos2).name == "homedecor:refrigerator_steel_top" then
			minetest.remove_node(pos2)
		end
	end,
    on_construct = function(pos)
        local meta = minetest.get_meta(pos)
        meta:set_string("formspec",
                "size[10,10]"..
                "list[current_name;main;0,0;10,5;]"..
                "list[current_player;main;1,6;8,4;]")
        meta:set_string("infotext", S("Refrigerator"))
        local inv = meta:get_inventory()
        inv:set_size("main",50)
    end,
    can_dig = function(pos,player)
        local meta = minetest.get_meta(pos);
        local inv = meta:get_inventory()
        return inv:is_empty("main")
    end,
    on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
		minetest.log("action", S("%s moves stuff in refrigerator at %s"):format(
		    player:get_player_name(),
		    minetest.pos_to_string(pos)
		))
    end,
    on_metadata_inventory_put = function(pos, listname, index, stack, player)
		minetest.log("action", S("%s moves stuff to refrigerator at %s"):format(
		    player:get_player_name(),
		    minetest.pos_to_string(pos)
		))
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, player)
		minetest.log("action", S("%s takes stuff from refrigerator at %s"):format(
		    player:get_player_name(),
		    minetest.pos_to_string(pos)
		))
    end,
})

minetest.register_node("homedecor:refrigerator_steel_top", {
	tiles = {
		"homedecor_refrigerator_steel_top.png",
		"default_steel_block.png",
		"homedecor_refrigerator_steel_sides1.png",
		"homedecor_refrigerator_steel_sides1.png^[transformFX",
		"homedecor_refrigerator_steel_back1.png",
		"homedecor_refrigerator_steel_front1.png"
	},
	drawtype = "nodebox",
	paramtype = "light",
    paramtype2 = "facedir",
    groups = {snappy=3},
	node_box = fridge_model_top,
	selection_box = {
		type = "fixed",
		fixed = { 0, 0, 0, 0, 0, 0 }
	},
})

-- white, enameled fridge

minetest.register_node("homedecor:refrigerator_white_bottom", {
	tiles = {
		"default_steel_block.png",
		"homedecor_refrigerator_white_bottom.png",
		"homedecor_refrigerator_white_sides2.png",
		"homedecor_refrigerator_white_sides2.png^[transformFX",
		"homedecor_refrigerator_white_back2.png",
		"homedecor_refrigerator_white_front2.png"
	},
	inventory_image = "homedecor_refrigerator_white_inv.png",
    description = S("Refrigerator"),
	drawtype = "nodebox",
	paramtype = "light",
    paramtype2 = "facedir",
    groups = {snappy=3},
	node_box = fridge_model_bottom,
	selection_box = {
		type = "fixed",
		fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }
	},
	on_place = function(itemstack, placer, pointed_thing)
		local pos = pointed_thing.under
		local pnode = minetest.get_node(pointed_thing.under)
		local rnodedef = minetest.registered_nodes[pnode.name]

		if not rnodedef["buildable_to"] then
			pos = pointed_thing.above
		end

		local fdir = minetest.dir_to_facedir(placer:get_look_dir())
		local pos2 = { x = pos.x, y=pos.y + 1, z = pos.z }

		local tnode = minetest.get_node(pos)
		local tnode2 = minetest.get_node(pos2)

		if homedecor.get_nodedef_field(tnode.name, "buildable_to")
		  and homedecor.get_nodedef_field(tnode2.name, "buildable_to")
		  and not minetest.is_protected(pos, placer:get_player_name())
		  and not minetest.is_protected(pos2, placer:get_player_name()) then
			local nodename = itemstack:get_name()
			minetest.add_node(pos, { name = nodename, param2 = fdir })
			minetest.add_node(pos2, { name = "homedecor:refrigerator_white_top", param2 = fdir })

			if string.find(nodename, "_locked") then
		        local meta = minetest.get_meta(pos)
				meta:set_string("owner", placer:get_player_name() or "")
				meta:set_string("infotext", S("Locked Refrigerator (owned by %s)"):format(meta:get_string("owner")))
			end

			if not homedecor.expect_infinite_stacks then
				itemstack:take_item()
				return itemstack
			end
		end
	end,
	after_dig_node = function(pos, oldnode, oldmetadata, digger)
		local pos2 = { x = pos.x, y=pos.y + 1, z = pos.z }
		if minetest.get_node(pos2).name == "homedecor:refrigerator_white_top" then
			minetest.remove_node(pos2)
		end
	end,
    on_construct = function(pos)
        local meta = minetest.get_meta(pos)
        meta:set_string("formspec",
                "size[10,10]"..
                "list[current_name;main;0,0;10,5;]"..
                "list[current_player;main;1,6;8,4;]")
        meta:set_string("infotext", S("Refrigerator"))
        local inv = meta:get_inventory()
        inv:set_size("main",50)
    end,
    can_dig = function(pos,player)
        local meta = minetest.get_meta(pos);
        local inv = meta:get_inventory()
        return inv:is_empty("main")
    end,
    on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
		minetest.log("action", S("%s moves stuff in refrigerator at %s"):format(
		    player:get_player_name(),
		    minetest.pos_to_string(pos)
		))
    end,
    on_metadata_inventory_put = function(pos, listname, index, stack, player)
		minetest.log("action", S("%s moves stuff to refrigerator at %s"):format(
		    player:get_player_name(),
		    minetest.pos_to_string(pos)
		))
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, player)
		minetest.log("action", S("%s takes stuff from refrigerator at %s"):format(
		    player:get_player_name(),
		    minetest.pos_to_string(pos)
		))
    end,
})

minetest.register_node("homedecor:refrigerator_white_top", {
	tiles = {
		"homedecor_refrigerator_white_top.png",
		"default_steel_block.png",
		"homedecor_refrigerator_white_sides1.png",
		"homedecor_refrigerator_white_sides1.png^[transformFX",
		"homedecor_refrigerator_white_back1.png",
		"homedecor_refrigerator_white_front1.png"
	},
	drawtype = "nodebox",
	paramtype = "light",
    paramtype2 = "facedir",
    groups = {snappy=3},
	node_box = fridge_model_top,
	selection_box = {
		type = "fixed",
		fixed = { 0, 0, 0, 0, 0, 0 }
	},
})

-- convert the old single-node fridges to the new two-node models

minetest.register_abm({
	nodenames = { "homedecor:refrigerator" },
	interval = 1,
	chance = 1,
	action = function(pos, node, active_object_count, active_object_count_wider)
		local fdir = node.param2
		local p_top = { x=pos.x, y=pos.y+1, z=pos.z }
		minetest.swap_node(pos, { name = "homedecor:refrigerator_white_bottom", param2 = fdir })
		minetest.set_node(p_top, { name = "homedecor:refrigerator_white_top", param2 = fdir })
	end
})

minetest.register_abm({
	nodenames = { "homedecor:refrigerator_locked" },
	interval = 1,
	chance = 1,
	action = function(pos, node, active_object_count, active_object_count_wider)
		local fdir = node.param2
		local p_top = { x=pos.x, y=pos.y+1, z=pos.z }
		minetest.swap_node(pos, { name = "homedecor:refrigerator_white_bottom_locked", param2 = fdir })
		minetest.set_node(p_top, { name = "homedecor:refrigerator_white_top", param2 = fdir })
	end
})

minetest.register_abm({
	nodenames = { "homedecor:refrigerator_steel" },
	interval = 1,
	chance = 1,
	action = function(pos, node, active_object_count, active_object_count_wider)
		local fdir = node.param2
		local p_top = { x=pos.x, y=pos.y+1, z=pos.z }
		minetest.swap_node(pos, { name = "homedecor:refrigerator_steel_bottom", param2 = fdir })
		minetest.set_node(p_top, { name = "homedecor:refrigerator_steel_top", param2 = fdir })
	end
})

minetest.register_abm({
	nodenames = { "homedecor:refrigerator_steel_locked" },
	interval = 1,
	chance = 1,
	action = function(pos, node, active_object_count, active_object_count_wider)
		local fdir = node.param2
		local p_top = { x=pos.x, y=pos.y+1, z=pos.z }
		minetest.swap_node(pos, { name = "homedecor:refrigerator_steel_bottom_locked", param2 = fdir })
		minetest.set_node(p_top, { name = "homedecor:refrigerator_steel_top", param2 = fdir })
	end
})