
-- chunkworx_web.lua

-- WebAdmin-related functions





local function Buttons_Player( Name )
	return "<form method='POST'><input type='hidden' name='PlayerName' value='"..Name.."'><input type='submit' name='PlayerExact' value='Exact'><input type='submit' name='Player3x3' value='3x3'></form>"
end





local function Button_World( Name )
	return "<form method='POST'><input type='hidden' name='WorldName' value='"..Name.."'><input type='submit' name='SelectWorld' value='Select'></form>"
end





local function SaveSettings()
	local SettingsIni = cIniFile()
	SettingsIni:SetValueI("Area data",   "StartX",  AreaStartX)
	SettingsIni:SetValueI("Area data",   "StartZ",  AreaStartZ)
	SettingsIni:SetValueI("Area data",   "EndX",    AreaEndX)
	SettingsIni:SetValueI("Area data",   "EndZ",    AreaEndZ)
	SettingsIni:SetValueI("Radial data", "RadialX", RadialX)
	SettingsIni:SetValueI("Radial data", "RadialZ", RadialZ)
	SettingsIni:SetValueI("Radial data", "Radius",  Radius)
	SettingsIni:WriteFile("ChunkWorx.ini")
end





function HandleRequest_Generation( Request )
	local Content = ""
	if (Request.PostParams["AGHRRRR"] ~= nil) then
		GENERATION_STATE = 0
		WW_instance:SaveAllChunks()
		WW_instance:QueueUnloadUnusedChunks()
		LOGERROR("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": works ABORTED by admin")
	end
	--Content = Content .. "<head><meta http-equiv=\"refresh\" content=\"2;\"></head>"
					-- PROCESSING
	--------------------------------------------------------------------------------------------------
	local function ProcessingContent()
		local _small_content = ""
		_small_content = _small_content .. "<head><meta http-equiv=\"refresh\" content=\"2;\"></head>"
		_small_content = _small_content .. "<h4>World for operations:</h4>"..WORK_WORLD
		if (OPERATION_CODE == 0) then
			_small_content = _small_content .. "<h4>Operation:</h4>Generation"
		elseif (OPERATION_CODE == 1) then
			_small_content = _small_content .. "<h4>Operation:</h4>Regeneration"
		end
		_small_content = _small_content .. "<h4>Area:   </h4>["..AreaStartX..":"..AreaStartZ.."]   ["..AreaEndX..":"..AreaEndZ.."]"
		_small_content = _small_content .. "<h4>Progress:</h4>"..CURRENT.."/"..TOTAL
		_small_content = _small_content .. "<br>"
		_small_content = _small_content .. "<form method='POST'>"
		_small_content = _small_content .. "<input type='submit' name='AGHRRRR' value='Stop'>"
		_small_content = _small_content .. "</form>"
		return _small_content
	end
	if (GENERATION_STATE == 2 or GENERATION_STATE == 4) then
		Content = ProcessingContent()
		return Content
	end
					-- SELECTING
	--------------------------------------------------------------------------------------------------
		if ( Request.PostParams["FormSetWorld"] ) then
			WORK_WORLD = Request.PostParams["FormWorldName"]
			WW_instance = cRoot:Get():GetWorld(WORK_WORLD)
		end
		
		if( Request.PostParams["SelectWorld"] ~= nil
		and Request.PostParams["WorldName"] ~= nil ) then		-- World is selected!
			WORK_WORLD = Request.PostParams["WorldName"]
			WW_instance = cRoot:Get():GetWorld(WORK_WORLD)
		end
		
		if(Request.PostParams["OperationGenerate"] ~= nil) then
			OPERATION_CODE = 0
		end
		if(Request.PostParams["OperationReGenerate"] ~= nil) then
			OPERATION_CODE = 1
		end
		
		if (GENERATION_STATE == 0) then
			if( Request.PostParams["FormAreaStartX"] ~= nil
			and Request.PostParams["FormAreaStartZ"] ~= nil
			and Request.PostParams["FormAreaEndX"] ~= nil
			and Request.PostParams["FormAreaEndZ"] ~= nil ) then	--(Re)Generation valid!
				-- COMMON (Re)gen
				if( Request.PostParams["StartArea"]) then
					AreaStartX = tonumber(Request.PostParams["FormAreaStartX"])
					AreaStartZ = tonumber(Request.PostParams["FormAreaStartZ"])
					AreaEndX = tonumber(Request.PostParams["FormAreaEndX"])
					AreaEndZ = tonumber(Request.PostParams["FormAreaEndZ"])
					SaveSettings();
					if (OPERATION_CODE == 0) then
						GENERATION_STATE = 1
					elseif (OPERATION_CODE == 1) then
						GENERATION_STATE = 3
					end
					Content = ProcessingContent()
					return Content
				end
			end
			if( Request.PostParams["FormRadialX"] ~= nil
			and Request.PostParams["FormRadialZ"] ~= nil
			and Request.PostParams["FormRadius"] ~= nil ) then	--(Re)Generation valid!
				-- COMMON (Re)gen
				if( Request.PostParams["StartRadial"]) then
					RadialX = tonumber(Request.PostParams["FormRadialX"]) or 0
					RadialZ = tonumber(Request.PostParams["FormRadialZ"]) or 0
					Radius =  tonumber(Request.PostParams["FormRadius"])  or 10
					AreaStartX = RadialX - Radius
					AreaStartZ = RadialZ - Radius
					AreaEndX = RadialX + Radius
					AreaEndZ = RadialZ + Radius
					SaveSettings()
					if (OPERATION_CODE == 0) then
						GENERATION_STATE = 1
					elseif (OPERATION_CODE == 1) then
						GENERATION_STATE = 3
					end
					Content = ProcessingContent()
					return Content
				end
			end
			-- POINT REGEN!
			if( Request.PostParams["FormPointX"] ~= nil
			and Request.PostParams["FormPointZ"] ~= nil ) then	--ReGeneration valid!
				-- EXACT
				if ( Request.PostParams["PointExact"] ~= nil) then
					AreaStartX = tonumber(Request.PostParams["FormPointX"])
					AreaStartZ = tonumber(Request.PostParams["FormPointZ"])
					AreaEndX = AreaStartX
					AreaEndZ = AreaStartZ
					GENERATION_STATE = 3
					Content = ProcessingContent()
					return Content
				end
				-- 3x3
				if ( Request.PostParams["Point3x3"] ~= nil) then
					AreaStartX = tonumber(Request.PostParams["FormPointX"]) - 1
					AreaStartZ = tonumber(Request.PostParams["FormPointZ"]) - 1
					AreaEndX = AreaStartX + 2
					AreaEndZ = AreaStartZ + 2
					GENERATION_STATE = 3
					Content = ProcessingContent()
					return Content
				end
			end
			
			local GetAreaByPlayer = function(Player)
				-- Player is valid only within this function, it cannot be stord and used later!
				AreaStartX = Player:GetChunkX()
				AreaStartZ = Player:GetChunkZ()
			end
			-- PLAYERS REGEN!
			if( Request.PostParams["PlayerExact"] ~= nil
			and Request.PostParams["PlayerName"] ~= nil ) then		-- Making BOOM! I meant, regenereate...
				cRoot:Get():GetWorld(WORK_WORLD):DoWithPlayer(Request.PostParams["PlayerName"],GetAreaByPlayer)
				AreaEndX = AreaStartX
				AreaEndZ = AreaStartZ
				GENERATION_STATE = 3
				Content = ProcessingContent()
				return Content
			end
			if( Request.PostParams["Player3x3"] ~= nil
			and Request.PostParams["PlayerName"] ~= nil ) then		-- Making BOOM! I meant, regenereate...
				cRoot:Get():GetWorld(WORK_WORLD):DoWithPlayer(Request.PostParams["PlayerName"],GetAreaByPlayer)
				AreaStartX = AreaStartX - 1
				AreaStartZ = AreaStartZ - 1
				AreaEndX = AreaStartX + 2
				AreaEndZ = AreaStartZ + 2
				GENERATION_STATE = 3
				Content = ProcessingContent()
				return Content
			end
		end
		
		--Content = Content .. "<h4>World for operations: " .. WORK_WORLD .. "</h4>"
		--Content = Content .. "<form method='POST'>"
		--Content = Content .. "<input type='text' name='FormWorldName' value='Input world name here'><input type='submit' name='FormSetWorld' value='Set world'>"
		--Content = Content .. "</form>"
		
		-- SELECTING WORK_WORLD
		Content = Content .. "<h4>World for operations: " .. WORK_WORLD .. "</h4>"
		Content = Content .. "<table>"
		local WorldNum = 0
		local AddWorldToTable = function(World)
			WorldNum = WorldNum + 1
			Content = Content .. "<tr>"
			Content = Content .. "<td style='width: 10px;'>" .. WorldNum .. ".</td>"
			Content = Content .. "<td>" .. World:GetName() .. "</td>"
			Content = Content .. "<td>" .. Button_World(World:GetName()) .. "</td>"
			Content = Content .. "</tr>"
		end
		cRoot:Get():ForEachWorld(AddWorldToTable)
		if( WorldNum == 0 ) then
			Content = Content .. "<tr><td>No worlds! O_O</td></tr>"
		end
		Content = Content .. "</table>"
		Content = Content .. "<br>"
		
		-- SELECTING OPERATION
		if (OPERATION_CODE == 0) then
			Content = Content .. "<h4>Operation: Generation</h4>"
		elseif (OPERATION_CODE == 1) then
			Content = Content .. "<h4>Operation: Regeneration</h4>"
		end
		Content = Content .. "<form method='POST'>"
		Content = Content .. "<input type='submit' name='OperationGenerate' value='Generation'>"
		Content = Content .. "<input type='submit' name='OperationReGenerate' value='Regeneration'>"
		Content = Content .. "</form>"
		
		-- SELECTING AREA
		Content = Content .. "<h4>Area:   </h4>Start X, Start Z;    End X, End Z"
		Content = Content .. "<form method='POST'>"
		Content = Content .. "<input type='text' name='FormAreaStartX' value='" .. AreaStartX .. "'><input type='text' name='FormAreaStartZ' value='" .. AreaStartZ .. "'>"
		Content = Content .. "<input type='text' name='FormAreaEndX' value='" .. AreaEndX .. "'><input type='text' name='FormAreaEndZ' value='" .. AreaEndZ .. "'>"
		Content = Content .. "<input type='submit' name='StartArea' value='Start'>"
		Content = Content .. "</form>"
		
		-- SELECTING RADIAL
		Content = Content .. "<h4>Radial:   </h4>Center X, Center Z, Radius"
		Content = Content .. "<form method='POST'>"
		Content = Content .. "<input type='text' name='FormRadialX' value='" .. RadialX .. "'><input type='text' name='FormRadialZ' value='" .. RadialZ .. "'><input type='text' name='FormRadius' value='" .. Radius .. "'>"
		Content = Content .. "<input type='submit' name='StartRadial' value='Start'>"
		Content = Content .. "</form>"
		Content = Content .. "<br>"
		Content = Content .. "<br>"
		Content = Content .. "<br>"
		
		-- SELECTING POINT
		Content = Content .. "<h4>Point regeneration:</h4> X, Z"
		Content = Content .. "<form method='POST'>"
		Content = Content .. "<input type='text' name='FormPointX' value='0'><input type='text' name='FormPointZ' value='0'>"
		Content = Content .. "<input type='submit' name='PointExact' value='Exact'>"
		Content = Content .. "<input type='submit' name='Point3x3' value='3x3'>"
		Content = Content .. "</form>"
		
		-- SELECTING PLAYERS
		Content = Content .. "<h4>Player-based regeneration:</h4>"
		Content = Content .. "<table>"
		local PlayerNum = 0
		local AddPlayerToTable = function( Player )
			PlayerNum = PlayerNum + 1
			Content = Content .. "<tr>"
			Content = Content .. "<td style='width: 10px;'>" .. PlayerNum .. ".</td>"
			Content = Content .. "<td>" .. Player:GetName() .. "</td>"
			Content = Content .. "<td>" .. Buttons_Player(Player:GetName()) .. "</td>"
			Content = Content .. "</tr>"
		end
		if (cRoot:Get():GetWorld(WORK_WORLD) == nil) then
			Content = Content .. "<tr><td>Incorrect world selection</td></tr>"
		else
			cRoot:Get():GetWorld(WORK_WORLD):ForEachPlayer( AddPlayerToTable )
			if( PlayerNum == 0 ) then
				Content = Content .. "<tr><td>No connected players</td></tr>"
			end
		end
		Content = Content .. "</table>"
		Content = Content .. "<br>"
	return Content
end