-- annotation.lua contains EmmyLua annotations for cpp_function & cpp_variable\

-- ball player

player = {
    x = 0,
    y = 0,
    size = 20
}


avoid_cubes = {}

timer = 0
max_timer = 10

function create_cube(x, y, size, timer_to_explode, exploded, death_timer)
    return {
        x = x,
        y = y,
        size = size,
        timer_to_explode = timer_to_explode,
        death_timer = death_timer,
        exploded = exploded
    }
end

function create_random_cube()
    local x = math.random(0, 800)
    local y = math.random(0, 600)
    local size = math.random(10, 50)
    local timer_to_explode = math.random(50, 200)
    local exploded = false
    local death_timer = math.random(50, 200)
    return create_cube(x, y, size, timer_to_explode, exploded, death_timer)
end



--- @param Engine GameEngine
--- @param cube table
function draw_cube(Engine, cube)
    if cube.exploded then
        Engine:setColor(Color.new(255, 0, 0))
        Engine:fillRect(cube.x, cube.y, cube.size, cube.size)
    else 
        Engine:setColor(Color.new(0, 255, 0))
        Engine:drawRect(cube.x, cube.y, cube.size, cube.size)
    end
end

function update_cubes()
    for i, cube in ipairs(avoid_cubes) do
        cube.timer_to_explode = cube.timer_to_explode - 1
        if cube.timer_to_explode < 0 then
            cube.exploded = true
        end

        if cube.exploded then
            cube.death_timer = cube.death_timer - 1
            if cube.death_timer < 0 then
                table.remove(avoid_cubes, i)
            end
        end
    end
end

function draw_player(Engine) 
    Engine:setColor(Color.new(255, 0, 0))
    Engine:fillRect(player.x, player.y, player.size, player.size)
end

--- the setup function
--- @param Engine GameEngine # The GameEngine instance.
--- @return nil
function setup_window(Engine) 
    Engine:setTitle("Hello World new")
    Engine:setWidth(800)
    Engine:setHeight(600)
    Engine:setFrameRate(60)
end

--- the set_keylist function
--- @return string
function set_keylist() 
    return "WASD"
end

--- the update function
--- @param Engine GameEngine # The GameEngine instance.
--- @return nil
function update(Engine) 
    if Engine:isKeyDown("W") then
        player.y = player.y - 5
    end
    
    if Engine:isKeyDown("A") then
        player.x = player.x - 5
    end
    
    if Engine:isKeyDown("S") then
        player.y = player.y + 5
    end
    
    if Engine:isKeyDown("D") then
        player.x = player.x + 5
    end

    timer = timer + 1
    if timer > max_timer then
        table.insert(avoid_cubes, create_random_cube())
        timer = 0
    end

    update_cubes()

    player.x = Engine:getMouseX()
    player.y = Engine:getMouseY()
end


--- the draw function
--- @param Engine GameEngine # The GameEngine instance.
--- @return nil
function draw(Engine)
    Engine:fillScreen(Color.new(0, 0, 0))
    draw_player(Engine)
    for i, cube in ipairs(avoid_cubes) do
        draw_cube(Engine, cube)
    end
end