I want to assign players to random table and with restrictions on how many can go in one table? So I have tried it this way but nothing works like its supposed to. How can you solve the issues with this script, and should I rewrite it?(No errors, also,I cut the script)

local Players = game:GetService("Players")

NeedRole = {}
Villagers = {}
Werewolves ={}
Arsonists = {}
Hunters ={}
Mediums ={}
Seers ={}
Jesters ={}
Witches ={}

Printing = false

game.Players.PlayerAdded:Connect(function(plr)
	table.insert(NeedRole,1,plr)
    print("Just joined: "..plr.Name)
 if table.getn(Players:GetPlayers()) == 3
then
    print("There are "..table.getn(Players:GetPlayers()).." Players, choosing Roles!")
	wait(1)
	print("...Choosing...")
	wait(3)
	for _,randomplayer in pairs(NeedRole)
	do
		randomplayer =  NeedRole[math.random(1, #NeedRole)]
		print(randomplayer)
		for indexeverywhere,player in pairs(NeedRole)
		do
			if player == randomplayer then
				return indexeverywhere
		end	
			print(indexeverywhere)
		if #Villagers < 2
      then
			table.insert(Villagers,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
			print(table.unpack(NeedRole))
			elseif #Werewolves < 3
		then
			table.insert(Werewolves,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
			elseif #Arsonists < 1
		then
			table.insert(Arsonists,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
			elseif #Hunters < 1
		then
			table.insert(Hunters,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
			elseif #Mediums <1
		then
			table.insert(Mediums,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
			elseif #Seers <1
		then
			table.insert(Seers,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
			elseif #Jesters <1
		then
			table.insert(Jesters,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
			elseif #Witches <1
		then
			table.insert(Witches,1,randomplayer)
			table.remove(NeedRole,indexeverywhere)
		end
	end
end