--luacheck: ignore
local event = require 'utils.event'

local function get_empty_hotbar_slot(player)
    for i = 1, 20, 1 do
        local item = player.get_quick_bar_slot(i)
        if not item then
            return i
        end
    end
    return false
end

local function is_item_already_present_in_hotbar(player, item)
    for i = 1, 20, 1 do
        local prototype = player.get_quick_bar_slot(i)
        if prototype then
            if item == prototype.name then
                return true
            end
        end
    end
    return false
end

local function set_hotbar(player, item)
    if not prototypes.entity[item] then
        return
    end
    if not prototypes.recipe[item] then
        return
    end
    local slot_index = get_empty_hotbar_slot(player)
    if not slot_index then
        return
    end
    if is_item_already_present_in_hotbar(player, item) then
        return
    end
    player.set_quick_bar_slot(slot_index, item)
end

local function on_player_fast_transferred(event)
    if not storage.auto_hotbar_enabled[event.player_index] then
        return
    end
    local player = game.players[event.player_index]
    for name, count in pairs(player.get_main_inventory().get_contents()) do
        set_hotbar(player, name)
    end
end

local function on_player_crafted_item(event)
    if not storage.auto_hotbar_enabled[event.player_index] then
        return
    end
    set_hotbar(game.players[event.player_index], event.item_stack.name)
end

local function on_picked_up_item(event)
    if not storage.auto_hotbar_enabled[event.player_index] then
        return
    end
    set_hotbar(game.players[event.player_index], event.item_stack.name)
end

local function on_player_mined_entity(event)
    if not storage.auto_hotbar_enabled[event.player_index] then
        return
    end
    set_hotbar(game.players[event.player_index], event.entity.name)
end

local function on_init()
    storage.auto_hotbar_enabled = {}
end

event.on_init(on_init)
event.add(defines.events.on_player_fast_transferred, on_player_fast_transferred)
event.add(defines.events.on_player_crafted_item, on_player_crafted_item)
event.add(defines.events.on_picked_up_item, on_picked_up_item)
event.add(defines.events.on_player_mined_entity, on_player_mined_entity)
