Inventory = {}

local function SafeInventoryCall(fn)
  local success, result = pcall(fn)
  if not success then
    Debug("error", "Inventory error: " .. tostring(result))
    return nil
  end
  return result
end

--- Retrieves the player's weapons from the inventory.
--- @return table A table containing the player's weapons.
function Inventory:GetWeapons()
  local weapons = {}
  local userInventory = self:GetUserInventory()

  if not userInventory then
    Debug("warn", "Unsupported inventory system: " .. tostring(Config.Inventory))
    return weapons
  end

  -- Iterate through the user's inventory and match weapons with the configured weapons
  for _, v in pairs(userInventory) do
    for key, val in pairs(Config.Weapons) do
      if v.name:lower() == key:lower() then
        weapons[key] = val
        weapons[key].attachments = self:GetWeaponAttachment(key)
        Debug("info", "Weapon found: " .. key)
        break
      end
    end
  end

  return weapons
end

--- Retrieves the attachments for a specific weapon.
--- @param item string The weapon name.
--- @return table A table containing the weapon's attachments.
function Inventory:GetWeaponAttachment(item)
  if not Config.UseWeaponAttachments then return {} end
  local components = {}
  local userInventory = self:GetUserInventory()

  if not userInventory then
    Debug("warn", "Unsupported inventory system: " .. tostring(Config.Inventory))
    return components
  end

  -- Iterate through the user's inventory and match attachments with the specified weapon
  for _, v in pairs(userInventory) do
    if v.name:lower() == item:lower() and v.info and v.info.attachments then
      for _, attachment in pairs(v.info.attachments) do
        table.insert(components, attachment.component)
        Debug("info", "Attachment found for weapon: " .. item .. " component: " .. attachment?.component)
      end
    end
  end

  return components
end

--- Retrieves the user's inventory based on the configured inventory system.
--- @return table|nil The user's inventory or nil if the inventory system is unsupported.
function Inventory:GetUserInventory()
  if Config.Inventory == "qs-inventory" then
    return SafeInventoryCall(function() return exports['qs-inventory']:getUserInventory() end)
  elseif Config.Inventory == "core_inventory" then
    return SafeInventoryCall(function() return exports.core_inventory:getInventory() end)
  elseif Config.Inventory == "qb-inventory" then
    return QBCore.Functions.GetPlayerData().items
  elseif Config.Inventory == "ox_inventory" then
    return exports.ox_inventory:GetPlayerItems()
  elseif Config.Inventory == "custom" then
    return CustomInventory:GetWeapons()
  else
    return nil
  end
end
