/**
 * Configuration settings for the WebAdmin
 *
 * Copyright 2009 Epic Games, Inc. All Rights Reserved
 *
 * @author  Michiel 'elmuerte' Hendriks
 */
class WebAdminSystemSettings extends WebAdminSettings implements(IQueryHandler);

`include(WebAdmin.uci)

var WebAdmin webadmin;
var QHCurrent qhcurrent;
var ChatLog chatlog;

var SettingsRenderer settingsRenderer;

//!localized
var localized string menuSystem, menuSystemDesc, msgSettingsSaved;

function init(WebAdmin webapp)
{
	webadmin = webapp;
}

function delayedInit()
{
	local IQueryHandler qh;
	local Object o;
	foreach webadmin.handlers(qh)
	{
		if (qh.IsA('QHCurrent'))
		{
			o = qh;
			qhcurrent = QHCurrent(o);
		}
	}
	foreach webadmin.WorldInfo.AllActors(class'ChatLog', chatlog)
	{
		break;
	}
}

function cleanup()
{
	settingsRenderer = none;
	qhcurrent = none;
	chatlog = none;
	webadmin = none;
}

function registerMenuItems(WebAdminMenu menu)
{
	menu.addMenu("/webadmin", menuSystem, self, menuSystemDesc, 999);
	menu.addMenu("/system/allowancecache", "", self, "Rebuild the mutator allowance cache.");
}

function bool handleQuery(WebAdminQuery q)
{
	switch (q.request.URI)
	{
		case "/webadmin":
			handleSettings(q);
			return true;
		case "/system/allowancecache":
			handleRebuildAllowanceCache(q);
			return true;
	}
	return false;
}

function bool unhandledQuery(WebAdminQuery q);

function decoratePage(WebAdminQuery q);

function bool producesXhtml()
{
	return true;
}

function handleRebuildAllowanceCache(WebAdminQuery q)
{
	local array<DCEGameInfo> gts;
	local int i;

	if (q.request.getVariable("action") ~= "rebuild")
	{
		webadmin.dataStoreCache.allowanceCache.length = 0;
		gts = webadmin.dataStoreCache.getGameTypes();
		for (i = 0; i < gts.length; i++)
		{
			webadmin.dataStoreCache.getMutators(gts[i].data.ClassName);
		}
		webadmin.addMessage(q, "Mutator allowance cache has been rebuild.");
	}

	webadmin.addMessage(q, "<form action=\""$WebAdmin.Path$q.Request.URI$"\" method=\"post\">"
		$"<p>Only rebuild the mutator cache when the server is empty. It is strongly adviced to restart the game after rebuilding has been completed.</p>"
		$"<p><button type=\"submit\" name=\"action\" value=\"rebuild\">Rebuild cache</button></p></form>", MT_Warning);

	q.response.Subst("page.title", "Rebuild Mutator Allowance Cache");
	webadmin.sendPage(q, "message.html");
}

function handleSettings(WebAdminQuery q)
{
	local ISettingsPrivileges privs;

	if (settingsRenderer == none)
	{
		delayedInit();
		loadSettings();
		settingsRenderer = new class'SettingsRenderer';
		settingsRenderer.init(webadmin.path);
	}

	if (q.request.getVariable("action") ~= "save")
	{
		class'QHDefaults'.static.applySettings(self, q.request);
		saveSettings();
		webadmin.addMessage(q, msgSettingsSaved);
	}

	privs = q.user.getSettingsPrivileges();
	if (privs != none)
	{
		privs.setBasePrivilegeUri(webadmin.getAuthURL(q.request.uri));
	}

	settingsRenderer.render(self, q.response,, privs);
	q.response.subst("liveAdjustStyle", "style=\"display: none;\"");
	webadmin.sendPage(q, "default_settings_general.html");
}

/**
 * Load the webadmin settings
 */
protected function loadSettings()
{
	// generic
	SetStringPropertyByName('AuthenticationClass', webadmin.AuthenticationClass);
	SetStringPropertyByName('SessionHandlerClass', webadmin.SessionHandlerClass);
	SetIntPropertyByName('bHttpAuth', int(webadmin.bHttpAuth));
	SetStringPropertyByName('startpage', webadmin.startpage);
	SetIntPropertyByName('bChatLog', int(webadmin.bChatLog));
	SetIntPropertyByName('bUseStrictContentType', int(webadmin.bUseStrictContentType));
	SetIntPropertyByName('sessionOctetValidation', webadmin.sessionOctetValidation);
	SetIntPropertyByName('MaxAuthFails', webadmin.MaxAuthFails);

	// qhcurrent
	if (qhcurrent != none)
	{
		SetIntPropertyByName('ChatRefresh', qhcurrent.ChatRefresh);
		SetIntPropertyByName('bConsoleEnabled', int(qhcurrent.bConsoleEnabled));
		SetStringArrayPropertyByName('denyUrlOptions', qhcurrent.denyUrlOptions, chr(10));
		SetStringArrayPropertyByName('denyConsoleCommands', qhcurrent.denyConsoleCommands, chr(10));
		SetIntPropertyByName('bAdminConsoleCommandsHack', int(qhcurrent.bAdminConsoleCommandsHack));
		SetStringPropertyByName('AdminCommandHandlerClass', qhcurrent.AdminCommandHandlerClass);
		SetIntPropertyByName('bEnableTeamChat', int(qhcurrent.bEnableTeamChat));
		SetIntPropertyByName('hideNews', int(qhcurrent.hideNews));
	}
	else {
		SetIntPropertyByName('ChatRefresh', class'QHCurrent'.default.ChatRefresh);
		SetIntPropertyByName('bConsoleEnabled', int(class'QHCurrent'.default.bConsoleEnabled));
		SetStringArrayPropertyByName('denyUrlOptions', class'QHCurrent'.default.denyUrlOptions, chr(10));
		SetStringArrayPropertyByName('denyConsoleCommands', class'QHCurrent'.default.denyConsoleCommands, chr(10));
		SetIntPropertyByName('bAdminConsoleCommandsHack', int(class'QHCurrent'.default.bAdminConsoleCommandsHack));
		SetStringPropertyByName('AdminCommandHandlerClass', class'QHCurrent'.default.AdminCommandHandlerClass);
		SetIntPropertyByName('bEnableTeamChat', int(class'QHCurrent'.default.bEnableTeamChat));
		SetIntPropertyByName('hideNews', int(class'QHCurrent'.default.hideNews));
	}

	if (chatlog != none)
	{
		SetStringPropertyByName('chatLogFilename', chatlog.filename);
		SetIntPropertyByName('chatLogUnique', int(chatlog.bUnique));
		SetIntPropertyByName('chatLogIncludeTimeStamp', int(chatlog.bIncludeTimeStamp));
	}
	else {
		SetStringPropertyByName('chatLogFilename', class'ChatLog'.default.filename);
		SetIntPropertyByName('chatLogUnique', int(class'ChatLog'.default.bUnique));
		SetIntPropertyByName('chatLogIncludeTimeStamp', int(class'ChatLog'.default.bIncludeTimeStamp));
	}
}

function saveSettings()
{
	local int intval;
	// generic
	GetStringPropertyByName('AuthenticationClass', webadmin.AuthenticationClass);
	GetStringPropertyByName('SessionHandlerClass', webadmin.SessionHandlerClass);
	if (GetIntPropertyByName('bHttpAuth', intval))
	{
		webadmin.bHttpAuth = intval != 0;
	}
	GetStringPropertyByName('startpage', webadmin.startpage);
	if (GetIntPropertyByName('bChatLog', intval))
	{
		webadmin.bChatLog = intval != 0;
	}
	if (GetIntPropertyByName('bUseStrictContentType', intval))
	{
		webadmin.bUseStrictContentType = intval != 0;
	}
	GetIntPropertyByName('sessionOctetValidation', webadmin.sessionOctetValidation);
	GetIntPropertyByName('MaxAuthFails', webadmin.MaxAuthFails);
	webadmin.SaveConfig();

	// qhcurrent
	if (qhcurrent != none)
	{
		GetIntPropertyByName('ChatRefresh', qhcurrent.ChatRefresh);
		if (GetIntPropertyByName('bConsoleEnabled', intval))
		{
			qhcurrent.bConsoleEnabled = intval != 0;
		}
		GetStringArrayPropertyByName('denyUrlOptions', qhcurrent.denyUrlOptions, chr(10));
		GetStringArrayPropertyByName('denyConsoleCommands', qhcurrent.denyConsoleCommands, chr(10));
		if (GetIntPropertyByName('bAdminConsoleCommandsHack', intval))
		{
			qhcurrent.bAdminConsoleCommandsHack = intval != 0;
		}
		GetStringPropertyByName('AdminCommandHandlerClass', qhcurrent.AdminCommandHandlerClass);
		if (GetIntPropertyByName('bEnableTeamChat', intval))
		{
			qhcurrent.bEnableTeamChat = intval != 0;
		}
		if (GetIntPropertyByName('hideNews', intval))
		{
			qhcurrent.hideNews = intval != 0;
		}
		qhcurrent.SaveConfig();
	}
	else {
		GetIntPropertyByName('ChatRefresh', class'QHCurrent'.default.ChatRefresh);
		if (GetIntPropertyByName('bConsoleEnabled', intval))
		{
			class'QHCurrent'.default.bConsoleEnabled = intval != 0;
		}
		GetStringArrayPropertyByName('denyUrlOptions', class'QHCurrent'.default.denyUrlOptions, chr(10));
		GetStringArrayPropertyByName('denyConsoleCommands', class'QHCurrent'.default.denyConsoleCommands, chr(10));
		if (GetIntPropertyByName('bAdminConsoleCommandsHack', intval))
		{
			class'QHCurrent'.default.bAdminConsoleCommandsHack = intval != 0;
		}
		GetStringPropertyByName('AdminCommandHandlerClass', class'QHCurrent'.default.AdminCommandHandlerClass);
		if (GetIntPropertyByName('bEnableTeamChat', intval))
		{
			class'QHCurrent'.default.bEnableTeamChat = intval != 0;
		}
		if (GetIntPropertyByName('hideNews', intval))
		{
			class'QHCurrent'.default.hideNews = intval != 0;
		}
		class'QHCurrent'.static.StaticSaveConfig();
	}

	// chatlog
	if (chatlog != none)
	{
		GetStringPropertyByName('chatLogFilename', chatlog.filename);
		if (GetIntPropertyByName('chatLogUnique', intval))
		{
			chatlog.bUnique = intval != 0;
		}
		if (GetIntPropertyByName('chatLogIncludeTimeStamp', intval))
		{
			chatlog.bIncludeTimeStamp = intval != 0;
		}
		chatlog.SaveConfig();
	}
	else {
		GetStringPropertyByName('chatLogFilename', class'ChatLog'.default.filename);
		if (GetIntPropertyByName('chatLogUnique', intval))
		{
			class'ChatLog'.default.bUnique = intval != 0;
		}
		if (GetIntPropertyByName('chatLogIncludeTimeStamp', intval))
		{
			class'ChatLog'.default.bIncludeTimeStamp = intval != 0;
		}
		class'ChatLog'.static.StaticSaveConfig();
	}
}

defaultProperties
{
	SettingsGroups.Add((groupId="General",pMin=0,pMax=20))
	SettingsGroups.Add((groupId="ChatLogging",pMin=20,pMax=30))
	SettingsGroups.Add((groupId="Authentication",pMin=30,pMax=40))
	SettingsGroups.Add((groupId="Advanced",pMin=100,pMax=120))

	// generic
	Properties.Add((PropertyId=100,Data=(Type=SDT_String)))
	Properties.Add((PropertyId=101,Data=(Type=SDT_String)))
	Properties.Add((PropertyId=30,Data=(Type=SDT_Int32)))
	Properties.Add((PropertyId=0,Data=(Type=SDT_String)))
	Properties.Add((PropertyId=20,Data=(Type=SDT_Int32)))
	Properties.Add((PropertyId=102,Data=(Type=SDT_Int32)))

	PropertyMappings.Add((Id=100,Name="AuthenticationClass"  ,MappingType=PVMT_RawValue,MinVal=0,MaxVal=256))
	PropertyMappings.Add((Id=101,name="SessionHandlerClass"  ,MappingType=PVMT_RawValue,MinVal=0,MaxVal=256))
	PropertyMappings.Add((Id=30,name="bHttpAuth"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))
	PropertyMappings.Add((Id=0,name="startpage"  ,MappingType=PVMT_RawValue,MinVal=0,MaxVal=256))
	PropertyMappings.Add((Id=20,name="bChatLog"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))
	PropertyMappings.Add((Id=102,name="bUseStrictContentType"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))

	// qhcurrent
	Properties.Add((PropertyId=1,Data=(Type=SDT_Int32)))
	Properties.Add((PropertyId=2,Data=(Type=SDT_Int32)))
	Properties.Add((PropertyId=3,Data=(Type=SDT_String)))
	Properties.Add((PropertyId=4,Data=(Type=SDT_String)))
	Properties.Add((PropertyId=104,Data=(Type=SDT_Int32)))
	Properties.Add((PropertyId=103,Data=(Type=SDT_String)))
	Properties.Add((PropertyId=5,Data=(Type=SDT_Int32)))
	Properties.Add((PropertyId=6,Data=(Type=SDT_Int32)))

	PropertyMappings.Add((Id=1,name="ChatRefresh"  ,MappingType=PVMT_Ranged,MinVal=0,MaxVal=9999,RangeIncrement=10))
	PropertyMappings.Add((Id=2,name="bConsoleEnabled"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))
	PropertyMappings.Add((Id=3,name="denyUrlOptions"  ,MappingType=PVMT_RawValue,MinVal=0,MaxVal=1024))
	PropertyMappings.Add((Id=4,name="denyConsoleCommands"  ,MappingType=PVMT_RawValue,MinVal=0,MaxVal=1024))
	PropertyMappings.Add((Id=104,name="bAdminConsoleCommandsHack"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))
	PropertyMappings.Add((Id=103,name="AdminCommandHandlerClass"  ,MappingType=PVMT_RawValue,MinVal=0,MaxVal=256))
	PropertyMappings.Add((Id=5,name="bEnableTeamChat"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))
	PropertyMappings.Add((Id=6,name="hideNews"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))

	// chatlog
	Properties.Add((PropertyId=21,Data=(Type=SDT_String)))
	Properties.Add((PropertyId=22,Data=(Type=SDT_Int32)))
	Properties.Add((PropertyId=23,Data=(Type=SDT_Int32)))
	PropertyMappings.Add((Id=21,name="chatLogFilename"  ,MappingType=PVMT_RawValue,MinVal=0,MaxVal=256))
	PropertyMappings.Add((Id=22,name="chatLogUnique"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))
	PropertyMappings.Add((Id=23,name="chatLogIncludeTimeStamp"  ,MappingType=PVMT_IdMapped,ValueMappings=((Id=0  ),(Id=1  ))))

	Properties.Add((PropertyId=31,Data=(Type=SDT_Int32)))
	PropertyMappings.Add((Id=31,name="sessionOctetValidation"  ,MappingType=PVMT_PredefinedValues,PredefinedValues=((Value1=0,Type=SDT_Int32),(Value1=1,Type=SDT_Int32),(Value1=2,Type=SDT_Int32),(Value1=3,Type=SDT_Int32),(Value1=4,Type=SDT_Int32)),MinVal=0,MaxVal=4,RangeIncrement=1))

	Properties.Add((PropertyId=32,Data=(Type=SDT_Int32)))
	PropertyMappings.Add((Id=32,name="MaxAuthFails",MappingType=PVMT_Ranged,MinVal=0,MaxVal=9999,RangeIncrement=1))
}