local CorePackages = game:GetService("CorePackages")

local User = require(CorePackages.AppTempCommon.LuaApp.Models.User)
local AddUsers = require(CorePackages.AppTempCommon.LuaApp.Actions.AddUsers)
local SetFriendCount = require(CorePackages.AppTempCommon.LuaApp.Actions.SetFriendCount)

return function(users)
	return function(store)
		local friendCountOffset = 0
		local updatedUsers = {}

		for _, user in pairs(users) do
			local needsUpdate = false
			local userId = user.id
			local isFriend = user.isFriend
			local offset = 0

			assert(typeof(isFriend) == "boolean")

			local userInStore = store:getState().Users[userId]
			if userInStore then
				-- Mark user with needsUpdate if any of the field is different
				-- from the existing user information in Store.
				if not User.compare(userInStore, user) then
					needsUpdate = true
					if userInStore.isFriend ~= isFriend then
						offset = isFriend and 1 or -1
					end
				end
			else
				needsUpdate = true
				offset = isFriend and 1 or 0
			end

			if needsUpdate then
				friendCountOffset = friendCountOffset + offset
				updatedUsers[userId] = user
			end
		end

		if next(updatedUsers) then
			store:dispatch(AddUsers(updatedUsers))
		end

		if friendCountOffset ~= 0 then
			local currentFriendCount = store:getState().FriendCount
			store:dispatch(SetFriendCount(currentFriendCount + friendCountOffset))
		end
	end
end