-- Responsible for giving out tools in personal servers

-- first, lets see if buildTools have already been created
-- create the object in lighting (TODO: move to some sort of "container" object when we have one)
local toolsArray = game.Lighting:FindFirstChild("BuildToolsModel")
local ownerArray = game.Lighting:FindFirstChild("OwnerToolsModel")
local hasBuildTools = false

function getIds(idTable, assetTable)
	for i = 1, #idTable do
		local model = game:GetService("InsertService"):LoadAsset(idTable[i])
		if model then
			local children = model:GetChildren()
			for i = 1, #children do
				if children[i]:IsA("Tool") then
					table.insert(assetTable,children[i])
				end
			end
		end
	end
end

function storeInLighting(modelName, assetTable)
	local model = Instance.new("Model")
	model.Archivable = false
	model.Name = modelName
	
	for i = 1, #assetTable do
		assetTable[i].Parent = model
	end
	
	if not game.Lighting:FindFirstChild(modelName) then -- no one beat us to it, we get to insert
		model.Parent = game.Lighting
	end
end

if not toolsArray then -- no one has made build tools yet, we get to!
	local buildToolIds = {}
	local ownerToolIds = {}

	table.insert(buildToolIds,73089166) -- PartSelectionTool
	table.insert(buildToolIds,73089190) -- DeleteTool
	table.insert(buildToolIds,73089204) -- CloneTool
	table.insert(buildToolIds,73089214) -- RotateTool	
	table.insert(buildToolIds,73089239) -- ConfigTool
	table.insert(buildToolIds,73089259) -- WiringTool
	table.insert(buildToolIds,58921588) -- ClassicTool
	
	table.insert(ownerToolIds, 65347268)

	-- next, create array of our tools
	local buildTools = {}
	local ownerTools = {}
	
	getIds(buildToolIds, buildTools)
	getIds(ownerToolIds, ownerTools)
	
	storeInLighting("BuildToolsModel",buildTools)
	storeInLighting("OwnerToolsModel",ownerTools)
	
	toolsArray = game.Lighting:FindFirstChild("BuildToolsModel")
	ownerArray = game.Lighting:FindFirstChild("OwnerToolsModel")
end

local localBuildTools = {}

function giveBuildTools()
	if not hasBuildTools then
		hasBuildTools = true
		local theTools = toolsArray:GetChildren()
		for i = 1, #theTools do
			local toolClone = theTools[i]:clone()
			if toolClone then
				toolClone.Parent = game.Players.LocalPlayer.Backpack
				table.insert(localBuildTools,toolClone)
			end
		end
	end
end

function giveOwnerTools()
	local theOwnerTools = ownerArray:GetChildren()
	for i = 1, #theOwnerTools do
		local ownerToolClone = theOwnerTools[i]:clone()
		if ownerToolClone then
			ownerToolClone.Parent = game.Players.LocalPlayer.Backpack
			table.insert(localBuildTools,ownerToolClone)
		end
	end
end

function removeBuildTools()
	if hasBuildTools then
		hasBuildTools = false
		for i = 1, #localBuildTools do
			localBuildTools[i].Parent = nil
		end
		localBuildTools = {}
	end
end

if game.Players.LocalPlayer.HasBuildTools then
	giveBuildTools()
end
if game.Players.LocalPlayer.PersonalServerRank >= 255 then
	giveOwnerTools()
end

local debounce = false
game.Players.LocalPlayer.Changed:connect(function(prop)
	if prop == "HasBuildTools" then
		while debounce do
			wait(0.5)
		end
		
		debounce = true
		
		if game.Players.LocalPlayer.HasBuildTools then
			giveBuildTools()
		else
			removeBuildTools()
		end
		
		if game.Players.LocalPlayer.PersonalServerRank >= 255 then
			giveOwnerTools()
		end
		
		debounce = false
	elseif prop == "PersonalServerRank" then
		if game.Players.LocalPlayer.PersonalServerRank >= 255 then
			giveOwnerTools()
		elseif game.Players.LocalPlayer.PersonalServerRank <= 0 then
			game.Players.LocalPlayer:Remove() -- you're banned, goodbye!
		end
	end
end)

game.Players.LocalPlayer.CharacterAdded:connect(function()
	hasBuildTools = false
	if game.Players.LocalPlayer.HasBuildTools then
		giveBuildTools()
	end
	if game.Players.LocalPlayer.PersonalServerRank >= 255 then
		giveOwnerTools()
	end
end)