-- Mesecons Door

models = {
    {
        -- bottom part
        {-0.5, -0.5, -0.5, -0.4, 0.5, 0.5},
        -- A
        {-0.5, 0.5, -0.5, -0.4, 1.5, -0.3},
        -- B
        {-0.5, 0.5, 0.3, -0.4, 1.5, 0.5},
        -- C
        {-0.5, 1.3, -0.3, -0.4, 1.5, 0.3},
        -- D
        {-0.5, 0.5, -0.3, -0.4, 0.6, 0.3},
        -- E
        {-0.5, 0.6, -0.05, -0.4, 1.3, 0.05},
        -- F
        {-0.5, 0.9, -0.3, -0.4, 1, -0.05},
        -- G
        {-0.5, 0.9, 0.05, -0.4, 1, 0.3}
    },
    {
        {0.4, -0.5, -0.5, 0.5, 0.5, 0.5},
        {0.4, 0.5, -0.5, 0.5, 1.5, -0.3},
        {0.4, 0.5, 0.3, 0.5, 1.5, 0.5},
        {0.4, 1.3, -0.3, 0.5, 1.5, 0.3},
        {0.4, 0.5, -0.3, 0.5, 0.6, 0.3},
        {0.4, 0.6, -0.05, 0.5, 1.3, 0.05},
        {0.4, 0.9, -0.3, 0.5, 1, -0.05},
        {0.4, 0.9, 0.05, 0.5, 1, 0.3}
    },
    {
        {-0.5, -0.5, -0.5, 0.5, 0.5, -0.4},
        {-0.5, 0.5, -0.5, -0.3, 1.5, -0.4},
        {0.3, 0.5, -0.5, 0.5, 1.5, -0.4},
        {-0.3, 1.3, -0.5, 0.3, 1.5, -0.4},
        {-0.3, 0.5, -0.5, 0.3, 0.6, -0.4},
        {-0.05, 0.6, -0.5, 0.05, 1.3, -0.4},
        {-0.3, 0.9, -0.5, -0.05, 1, -0.4},
        {0.05, 0.9, -0.5, 0.3, 1, -0.4}
    },
    {
        {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5},
        {-0.5, 0.5, 0.4, -0.3, 1.5, 0.5},
        {0.3, 0.5, 0.4, 0.5, 1.5, 0.5},
        {-0.3, 1.3, 0.4, 0.3, 1.5, 0.5},
        {-0.3, 0.5, 0.4, 0.3, 0.6, 0.5},
        {-0.05, 0.6, 0.4, 0.05, 1.3, 0.5},
        {-0.3, 0.9, 0.4, -0.05, 1, 0.5},
        {0.05, 0.9, 0.4, 0.3, 1, 0.5}
    }
}

selections = {
    {-0.5, -0.5, -0.5, -0.4, 1.5, 0.5},
    {0.5, -0.5, -0.5, 0.4, 1.5, 0.5},
    {-0.5, -0.5, -0.5, 0.5, 1.5, -0.4},
    {-0.5, -0.5, 0.4, 0.5, 1.5, 0.5}
}

transforms = {
    door_1_1 = "door_4_2",
    door_4_2 = "door_1_1",
    door_2_1 = "door_3_2",
    door_3_2 = "door_2_1",
    door_3_1 = "door_1_2",
    door_1_2 = "door_3_1",
    door_4_1 = "door_2_2",
    door_2_2 = "door_4_1"
}

mesecons_door_transform = function (pos, node)
    local x, y = node.name:find(":")
    local n = node.name:sub(x + 1)
    if transforms[n] ~= nil then
        minetest.env:add_node(pos, {name = "mesecons_door:"..transforms[n]})
    else
        print("not implemented")
    end
end

for i = 1, 4 do
    for j = 1, 2 do
        minetest.register_node("mesecons_door:door_"..i.."_"..j, {
            drawtype = "nodebox",
            tile_images = {"default_wood.png"},
            paramtype = "light",
            is_ground_content = true,
            groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2},
            drop = "mesecons_door:door",
            node_box = {
                type = "fixed",
                fixed = models[i]
            },
            selection_box = {
                type = "fixed",
                fixed = {
                    selections[i]
                }
            },
            on_punch = mesecons_door_transform
        })
	mesecon:register_effector("mesecons_door:door_"..i.."_"..j, "mesecons_door:door_"..i.."_"..j)
    end
end

minetest.register_node("mesecons_door:door", {
    description = "Wooden door",
    node_placement_prediction = "",
	inventory_image     = 'door_wood.png',
	wield_image         = 'door_wood.png',
    after_place_node = function(node_pos, placer)
        local best_distance = 1e50
        local best_number = 1
        local pos = placer:getpos()
        for i = 1, 4 do
            local box = minetest.registered_nodes["mesecons_door:door_"..i.."_1"].selection_box.fixed[1]
            box = {box[1] + node_pos.x, box[2] + node_pos.y, box[3] + node_pos.z, box[4] + node_pos.x, box[5] + node_pos.y, box[6] + node_pos.z}
            local center = {x = (box[1] + box[4]) / 2, y = (box[2] + box[5]) / 2, z = (box[3] + box[6]) / 2}
            local dist = math.pow(math.pow(center.x - pos.x, 2) + math.pow(center.y - pos.y, 2) + math.pow(center.z - pos.z, 2), 0.5)
            if dist < best_distance then
                best_distance = dist
                best_number = i
            end
        end
        minetest.env:add_node(node_pos, {name = "mesecons_door:door_"..best_number.."_1"})
    end
})
mesecon:register_effector("mesecons_door:door")

minetest.register_on_placenode(function(pos, newnode, placer)
    local b_pos = {x = pos.x, y = pos.y - 1, z = pos.z}
    local node = minetest.env:get_node(b_pos)
    if node.name:find("mesecons_door:door") ~= nil then
        minetest.env:remove_node(pos)
        minetest.env:add_item(pos, newnode.name)
    end
end)

minetest.register_craft({
	output = 'mesecons_door:door',
	recipe = {
		{ 'default:wood', 'default:wood', '' },
		{ 'default:wood', 'default:wood', '' },
		{ 'default:wood', 'default:wood', '' },
	},
})

--MESECONS
mesecon:register_on_signal_change(function(pos, node)
	if string.find(node.name, "mesecons_door:door_") then
		mesecons_door_transform(pos, node)
	end
end)