-- NUR DURCH 4 TEILBARE ZAHLEN > 20 VERWENDEN!!!
local leds = {
    40,
    36,
    32,
    28,
    24,
    20,
    16,
    12,
    8,
    4
}

for i = 1, #leds do
    if leds[i] % 4 ~= 0 then
        error("[ledtree] led count per layer must be divisible by 4. Error location: 'leds' table, item "..i..": "..leds[i])
    end
end

local height_increment = 3

local function breite(n)
    return n / 4
end

local function is_led(center, breite, pos)
    if math.abs(center.x - pos.x) >= (breite - 1) / 2 and math.abs(center.z - pos.z) >= (breite - 1) / 2 then
        return false
    end
    if math.abs(center.x - pos.x) == (breite - 1) / 2 then
        return math.abs(center.z - pos.z) % 2 == 0
    end
    if math.abs(center.z - pos.z) == (breite - 1) / 2 then
        return math.abs(center.x - pos.x) % 2 == 0
    end
end

local function place_layer(center, breite)
    breite = breite * 2 + 1
    local needles = {}
    local leds = {}
    local max_offset = (breite - 1) / 2
    for y = math.ceil(-height_increment / 2), math.floor(height_increment / 2) do
        for x = -max_offset, max_offset do
            for z = -max_offset, max_offset do
                local pos = vector.new({x = center.x + x, y = center.y + y, z = center.z + z})
                table.insert(needles, pos)
                if y == 0 and is_led(center, breite, pos) then
                    table.insert(leds, pos)
                end
            end
        end
    end
    core.bulk_set_node(needles, {name = "ledtree:pine_needles"})
    return leds
end

local function place_leds(led_index, leds)
    for i = 1, #leds do
        core.set_node(leds[i], {name = "ledtree:led"..led_index.."_red"})
        led_index = led_index + 1
    end
    return led_index
end

local function place_tree(pos)
    local led_index = 300 - 220
    for index = 1, #leds do
        local l = leds[index]
        local layer_center = vector.new(pos.x, pos.y + index * height_increment - height_increment / 2, pos.z)
        local leds = place_layer(layer_center, breite(l))
        led_index = place_leds(led_index, leds)
    end
end

core.register_node("ledtree:ledtree", {
    description = "Place LED tree",
    on_construct = function(pos)
        place_tree(pos)
    end,
})

core.register_node("ledtree:pine_needles", {
    description = "Pine Needles",
    paramtype = "light",
    tiles = {"pine_needles.png"},
})