------------------------------------
------------------------------------
---- DONT TOUCH ANY OF THIS IF YOU DON'T KNOW WHAT YOU ARE DOING
---- THESE ARE **NOT** CONFIG VALUES, USE THE CONVARS IF YOU WANT TO CHANGE SOMETHING
----
----
---- If you are a developer and want to change something, consider writing a plugin instead:
---- https://easyadmin.readthedocs.io/en/latest/plugins/
----
------------------------------------
------------------------------------

-- none of this code works anymore.

--[[

Citizen.CreateThread(function()
	local add_aces = {}
	local add_principals = {}
	function readAcePermissions()
		Citizen.CreateThread(function()
			add_aces, add_principals, execs = FindInfosinFile("server.cfg")
			for i, config in pairs(execs) do
				local tempaces, tempprincipals, _ = FindInfosinFile(config)
				add_aces = mergeTables(add_aces, tempaces)
				add_principals = mergeTables(add_principals, tempprincipals)
			end
		end)
	end
	
	function FindInfosinFile(filename)
		local path = GetResourcePath(GetCurrentResourceName())
		local occurance = string.find(path, "/resources", 1, true)
		local path = string.reverse(string.sub(string.reverse(path), -occurance))
		
		local filename = filename
		
		local lines = {}
		local needsExec = true
		local needsResourcePerms = true
		
		if filename == "server.cfg" then 
			needsResourcePerms = false
		elseif filename == "easyadmin_permissions.cfg" then
			needsExec = false
		else
			needsResourcePerms, needsExec = false, false
		end
		local changes = false
		local aces, principals, execs = {}, {}, {}
		
		PrintDebugMessage("reading "..filename, 4)
		
		local file = io.open(filename, "r")
		if file then
			line = file:read("*line")
			while line do
				table.insert(lines,line)
				line = file:read("*line")
			end
			file:close()
			
			for i, line in pairs(lines) do 
				if filename == "server.cfg" then
					needsResourcePerms = false
					if string.find(line, "exec easyadmin_permissions.cfg", 1, true) then
						needsExec = false
					end
				elseif filename == "easyadmin_permissions.cfg" then
					needsExec = false
					if string.find(line, "add_ace resource."..GetCurrentResourceName().." command.add_ace allow", 1, true) then
						needsResourcePerms = false
					end
				else
					local broken = false
					-- remove broken lines
					if string.find(line, "exec easyadmin_permissions.cfg", 1, true) then
						RemoveFromFile(filename, "exec easyadmin_permissions.cfg")
					elseif string.find(line, "add_ace resource."..GetCurrentResourceName().." command.", 1, true) then
						RemoveFromFile(filename, line)
					end 
				end

				-- filteredLine variable converts tabs to spaces, and multiple spaces to single space
				local filteredLine = string.gsub(line, "%s+", " ")
				-- remove comments
				filteredLine = string.gsub(filteredLine, "%s*#.*$", "")
				


				-- strip the arguments from the "add_ace", "add_principal" and "exec" commands and insert them into their respective tables
				if string.find(filteredLine, "add_ace", 1, true) then
					local args = string.split(filteredLine, " ")
					if args[2] and args[3] and args[4] then
						table.insert(aces, {file = filename, oldline = line, args[2], args[3], args[4]})
					end
				elseif string.find(filteredLine, "add_principal", 1, true) then
					local args = string.split(filteredLine, " ")
					if args[2] and args[3] then
						table.insert(principals, {file = filename, oldline = line, args[2], args[3]})
					end
				elseif string.find(filteredLine, "exec", 1, true) then
					local args = string.split(filteredLine, " ")
					if args[2] then
						table.insert(execs, args[2])
					end
				end
			end
			
			if needsExec or needsResourcePerms or changes then -- disabled as of 7.3, should be added manually.
				local newLines = {}
				--if needsExec then
				--	table.insert(newLines, "exec easyadmin_permissions.cfg")
				--	table.insert(execs, "easyadmin_permissions.cfg")
				--	PrintDebugMessage("Did not find `exec easyadmin_permissions.cfg`, added it automatically", 4)
				--	changes=true
				--end
				if needsResourcePerms then
				--	table.insert(newLines, "# This file was generated automatically by EasyAdmin #")
				--	table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.add_ace allow")
				--	table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.remove_ace allow")
				--	table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.add_principal allow")
				--	table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.remove_principal allow")
				--	PrintDebugMessage("Did not find `add_ace resource."..GetCurrentResourceName().."` lines, added them automatically", 4)
				--	changes=true
				end
				local output = "\n"
				if changes then
					local file = io.open(filename, "a+") -- reopen in write mode
					for i, line in pairs(newLines) do
						output=output..line.."\n"
					end
					file:write(output) -- write our lines
					file:close()
				end
			end
			
			for i,ace in pairs(aces) do 
				PrintDebugMessage("parsed ace ^1"
				..tostring(ace[1]).." "
				..tostring(ace[2]).." "
				..tostring(ace[3]).."^7 in "
				..filename.."\n", 4)
			end
			
			for i,ace in pairs(principals) do 
				PrintDebugMessage("parsed principal ^1"
				..tostring(ace[1]).." "
				..tostring(ace[2]).."^7 in "
				..filename.."\n", 4)
			end
			
			for i,ace in pairs(execs) do 
				PrintDebugMessage("parsed exec ^1"
				..tostring(ace).."^7 in "
				..filename.."\n", 4)
			end
			
			return aces, principals, execs
		else 
			if filename == "easyadmin_permissions.cfg" then
				local file = io.open(filename, "w")
				local newLines = {}
				table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.add_ace allow")
				table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.remove_ace allow")
				table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.add_principal allow")
				table.insert(newLines, "add_ace resource."..GetCurrentResourceName().." command.remove_principal allow")
				local output = ""
				for i, line in pairs(newLines) do
					output=output..line.."\n"
				end
				file:write(output) -- write our lines
				file:close()
			end
			PrintDebugMessage(filename.." cannot be read, bailing.", 4)
			return {}, {}, {}
		end
	end
	
	Citizen.CreateThread(function()
		lockedFiles = {}
		function AddToFile(filename, args)
			if not GetInvokingResource() or GetInvokingResource() == GetCurrentResourceName() then -- sorry, but i _really_ dont want other resources hooking into easyadmins file edit functions.

				local path = GetResourcePath(GetCurrentResourceName())
				local occurance = string.find(path, "/resources", 1, true)
				local path = string.reverse(string.sub(string.reverse(path), -occurance))
				
				
				local args = args
				local filename = filename
				while lockedFiles[filename] do
					Wait(100)
				end
				lockedFiles[filename] = true
				
				
				local file = io.open(filename, "a")
				if file then
					file:write("\n"..args) -- write our lines
					file:close()
				else 
					PrintDebugMessage(filename.." cannot be read, bailing.", 4)
					return {}, {}, {}
				end
				Wait(500) -- without waiting after saving a file it sometimes does not properly save, some OS limitation maybe?
				lockedFiles[filename] = false
			end
		end
		exports('AddToFile', AddToFile)
		
		function RemoveFromFile(filename, args, partial)
			if not GetInvokingResource() or GetInvokingResource() == GetCurrentResourceName() then -- sorry, but i _really_ dont want other resources hooking into easyadmins file edit functions.

				local path = GetResourcePath(GetCurrentResourceName())
				local occurance = string.find(path, "/resources", 1, true)
				local path = string.reverse(string.sub(string.reverse(path), -occurance))
				
				local args = args
				local filename = filename
				while lockedFiles[filename] do
					Wait(100)
				end
				lockedFiles[filename] = true
				
				local file = io.open(filename, "r")
				local lines = {}
				if file then
					local line = file:read("*line")
					while line do
						if (partial and string.find(line, args) or (not partial and line == args)) or (filename == "easyadmin_permissions.cfg" and line == "") then -- skip lines we dont want, incl. empty lines
						else
							table.insert(lines, line)
						end
						line = file:read("*line")
					end
					file:close()
					local output = ""
					for i, line in pairs(lines) do
						output=output..line.."\n"
					end
					local file = io.open(filename, "w")
					file:write(output) -- write our lines
					file:close()
				else 
					PrintDebugMessage(filename.." cannot be read, bailing.", 4)
					return {}, {}, {}
				end
				Wait(500) -- without waiting after saving a file it sometimes does not properly save, some OS limitation maybe?
				lockedFiles[filename] = false
			end
		end
		exports('RemoveFromFile', RemoveFromFile)
	end)
	
	RegisterServerEvent("EasyAdmin:getServerAces", function()
		if DoesPlayerHavePermission(source, "server.permissions.read") then
			TriggerLatentClientEvent("EasyAdmin:getServerAces", source, 100000, add_aces, add_principals)
		end
	end)
	
	RegisterServerEvent("EasyAdmin:setServerAces", function(aces,principals)
		if DoesPlayerHavePermission(source, "server.permissions.write") then
			local source=source
			local aces=aces
			local principals=principals
			-- reconfigure aces
			for i, ace in pairs(add_aces) do
				
				if not aces[i] then
					if not ace.file then ace.file = "easyadmin_permissions.cfg" end
					
					ExecuteCommand("remove_ace "..ace[1].." "..ace[2].." "..ace[3])
					RemoveFromFile(ace.file, ace.oldline or "add_ace "..ace[1].." "..ace[2].." "..ace[3])
					
					
					PrintDebugMessage("Executed remove_ace "..ace[1].." "..ace[2].." "..ace[3], 4)
				elseif aces[i][1] ~= ace[1] or aces[i][2] ~= ace[2] or aces[i][3] ~= ace[3] then
					if not ace.file then ace.file = "easyadmin_permissions.cfg" end
					if not aces[i].file then aces[i].file = "easyadmin_permissions.cfg" end
					ExecuteCommand("remove_ace "..ace[1].." "..ace[2].." "..ace[3])
					RemoveFromFile(ace.file, ace.oldline or "add_ace "..ace[1].." "..ace[2].." "..ace[3])
					
					ExecuteCommand("add_ace "..aces[i][1].." "..aces[i][2].." "..aces[i][3])
					AddToFile(aces[i].file, "add_ace "..aces[i][1].." "..aces[i][2].." "..aces[i][3])
					
					
					PrintDebugMessage("Executed remove_ace "..ace[1].." "..ace[2].." "..ace[3], 4)
					PrintDebugMessage("Executed add_ace "..aces[i][1].." "..aces[i][2].." "..aces[i][3], 4)
				end
			end
			for i, ace in pairs(aces) do
				if not add_aces[i] then
					if not ace.file then ace.file = "easyadmin_permissions.cfg" end
					
					ExecuteCommand("add_ace "..ace[1].." "..ace[2].." "..ace[3])
					AddToFile(ace.file, "add_ace "..ace[1].." "..ace[2].." "..ace[3])
					
					PrintDebugMessage("Executed add_ace "..ace[1].." "..ace[2].." "..ace[3], 4)
				end
			end
			-- reconfigure principals
			for i, principal in pairs(add_principals) do
				
				-- set file as our permissions file in case its unset
				
				if not principals[i] then
					if not principal.file then principal.file = "easyadmin_permissions.cfg" end
					
					ExecuteCommand("remove_principal "..principal[1].." "..principal[2])
					RemoveFromFile(principal.file, principal.oldline or "add_principal "..principal[1].." "..principal[2])
					
					PrintDebugMessage("Executed remove_principal "..principal[1].." "..principal[2], 4)
				elseif principals[i][1] ~= principal[1] or principals[i][2] ~= principal[2] then
					if not principal.file then principal.file = "easyadmin_permissions.cfg" end
					if not principals[i].file then principals[i].file = "easyadmin_permissions.cfg" end
					
					ExecuteCommand("remove_principal "..principal[1].." "..principal[2])
					RemoveFromFile(principal.file, principal.oldline or "add_principal "..principal[1].." "..principal[2])
					
					
					ExecuteCommand("add_principal "..principals[i][1].." "..principals[i][2])
					AddToFile(principals[i].file, "add_principal "..principals[i][1].." "..principals[i][2])
					
					PrintDebugMessage("Executed remove_principal "..principal[1].." "..principal[2], 4)
					PrintDebugMessage("Executed add_principal "..principals[i][1].." "..principals[i][2], 4)
				end
			end
			for i, principal in pairs(principals) do
				if not add_principals[i] then
					if not principal.file then principal.file = "easyadmin_permissions.cfg" end
					ExecuteCommand("add_principal "..principal[1].." "..principal[2])
					AddToFile(principal.file, "add_principal "..principal[1].." "..principal[2])
					
					PrintDebugMessage("Executed add_principal "..principal[1].." "..principal[2], 4)
				end
			end
			
			
			add_aces = aces
			add_principals = principals
			SendWebhookMessage(moderationNotification,string.format(GetLocalisedText("admineditedpermissions"), getName(source, false, true)), "permissions", 16777214)
			TriggerLatentClientEvent("EasyAdmin:getServerAces", source, 100000, add_aces, add_principals)
		end
	end)
end)


-- ]] 