-- luacheck: globals Game MyModGlobal CLIENT
if not CLIENT then return end

---@return Barotrauma.Location.StoreInfo[], string?
local function getCurrentStore()
	if not Game or not Game.GameSession or not Game.GameSession.Campaign then
		return nil, "No game session found"
	end

	local map = Game.GameSession.Campaign.Map
	if not map or not map.CurrentLocation or not map.CurrentLocation.Stores then
		return nil, "No map found"
	end

	local location = map.CurrentLocation

	-- Otherwise, determine which store is active by checking the cargo manager
	local cargoManager = Game.GameSession.Campaign.CargoManager
	if not cargoManager then
		return nil, "No cargo manager found"
	end

	-- Find which store has items in the cart
	local stores = {}
	for _, store in pairs(location.Stores) do
		if #cargoManager:GetBuyCrateItems(store) > 0 then
			stores[#stores + 1] = store
		end
	end

	return stores, nil
end

local function tryBuy()
	local cargoManager = Game.GameSession.Campaign.CargoManager
	if not cargoManager then
		MyModGlobal.debugPrint("No cargo manager available")
		return
	end

	local stores, err = getCurrentStore()
	if err then
		MyModGlobal.debugPrint(string.format("Error getting current store: %s", err))
		return
	end

	for _, store in ipairs(stores) do
		local toAdd = {}
		-- Get items available at the store
		local items = cargoManager:GetBuyCrateItems(store)
		for item in items do
			-- We have already added this many of item
			toAdd[item.ItemPrefab.Identifier.Value] = {
				quantity = -item.Quantity,
				prefab = item.ItemPrefab -- Store the ItemPrefab object
			}
		end
		for item in store.Stock do
			-- So if we add the total amount available
			-- We get the amount we have to add to buy entire stock
			local idValue = item.ItemPrefab.Identifier.Value
			if toAdd[idValue] then
				toAdd[idValue].quantity = toAdd[idValue].quantity + item.Quantity
			end
		end

		for idValue, info in pairs(toAdd) do
			if info.quantity > 0 then
				MyModGlobal.debugPrint(string.format("Adding %d of %s to the buy crate", info.quantity, idValue))
				-- Use the stored ItemPrefab object, not the string identifier
				cargoManager:ModifyItemQuantityInBuyCrate(store.Identifier, info.prefab, info.quantity)
			end
		end
	end
end

return {
	tryBuy = tryBuy
}
