#pragma semicolon 1

#include <sourcemod>
#include <multicolors>

#pragma newdecls required

/* CONVARS */
ConVar g_cvInterval;

/* DATABASE */
Database g_hDatabase;

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
	name        = "UNLOZE Donation Alert",
	author      = "Neon",
	description = "",
	version     = "1.0",
	url         = "https://steamcommunity.com/id/n3ontm"
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart()
{
	g_cvInterval = CreateConVar("sm_unloze_donation_alert_interval", "60", "", FCVAR_NONE);

	AutoExecConfig();

	char sError[256];
	if (SQL_CheckConfig("xenforo"))
		g_hDatabase = SQL_Connect("xenforo", true, sError, sizeof(sError));

	if (g_hDatabase == null)
		LogError("Could not connect to database: %s", sError);
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnMapStart()
{
	CreateTimer(g_cvInterval.FloatValue, CheckForNewDonations, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action CheckForNewDonations(Handle timer)
{
	char sDataFile[PLATFORM_MAX_PATH];
	BuildPath(Path_SM, sDataFile, sizeof(sDataFile), "configs/unloze_donation_alert/data.cfg");

	if(!FileExists(sDataFile))
	{
		LogError("Could not find data file: \"%s\"", sDataFile);
		return Plugin_Stop;
	}

	KeyValues Data = new KeyValues("unloze_donation_alert");

	if(!Data.ImportFromFile(sDataFile))
	{
		LogError("Unable to load data file: \"%s\"", sDataFile);
		delete Data;
		return Plugin_Stop;
	}

	if(!Data.JumpToKey("last_processed_donation", false))
	{
		LogError("Unable to find section last_processed_donation: \"%s\"",  sDataFile);
		delete Data;
		return Plugin_Stop;
	}

	int iID;
	iID = Data.GetNum("id", -1);
	if (iID == -1)
	{
		LogError("Unable to ID of last_processed_donation: \"%s\"",  sDataFile);
		delete Data;
		return Plugin_Stop;
	}

	char sQuery[255];
	Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_bdpaygate_log WHERE log_id = %d", iID + 1);
	g_hDatabase.Query(TQueryCB, sQuery, iID + 1);

	delete Data;
	return Plugin_Continue;
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void TQueryCB(Database db, DBResultSet results, const char[] error, any data)
{
	int iID = data;

	if (results.RowCount > 0)
	{
		int iField;
		char sLogType[64];
		char sLogDetails[4096];
		results.FetchRow();
		results.FieldNameToNum("log_type", iField);
		results.FetchString(iField, sLogType, sizeof(sLogType));

		if(!StrEqual(sLogType, "accepted"))
		{
			HandleDonation(iID);
			char sQuery[255];
			Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_bdpaygate_log WHERE log_id = %d", iID + 1);
			g_hDatabase.Query(TQueryCB, sQuery, iID + 1);
			return;
		}

		results.FieldNameToNum("log_details", iField);
		results.FetchString(iField, sLogDetails, sizeof(sLogDetails));
		static char sStrings[256][256];
		char sMessage[256];
		char sMessageWhite[256];
		int iStrings = ExplodeString(sLogDetails, "\"", sStrings, 256, 256);

		if (StrContains(sLogDetails, "user_upgrade") != -1)
		{
			for (int i = 0; i < iStrings; i++)
			{
				if (StrContains(sStrings[i], "Account Upgrade:") != -1)
				{
					char sBuffer[256];
					char sUpgrade[256];
					char sName[256];
					strcopy(sBuffer, sizeof(sBuffer), sStrings[i]);

					int iStart = FindCharInString(sBuffer, ':', false);
					strcopy(sBuffer, sizeof(sBuffer), sBuffer[iStart + 2]);
					iStart = FindCharInString(sBuffer, '(', false);
					strcopy(sName, sizeof(sName), sBuffer[iStart + 1]);
					int iLength = strlen(sName);
					sName[iLength-1] = 0;
					SplitString(sBuffer, "(", sUpgrade, sizeof(sUpgrade));
					Format(sMessage, sizeof(sMessage), "{unique}[UNLOZE] {lime}%s {white}just bought {unique}%s{white}! Thank you for supporting our servers!!!", sName, sUpgrade);
					Format(sMessageWhite, sizeof(sMessageWhite), "%s just bought %s! Thank you for supporting our servers!!!", sName, sUpgrade);

				}
			}
		}
		else if (StrContains(sLogDetails, "gift_upgrade") != -1)
		{
			for (int i = 0; i < iStrings; i++)
			{
				if (StrContains(sStrings[i], "Account Upgrade:") != -1)
				{
					char sBuffer[256];
					char sUpgrade[256];
					char sName[256];
					strcopy(sBuffer, sizeof(sBuffer), sStrings[i]);

					int iStart = FindCharInString(sBuffer, ':', false);
					strcopy(sBuffer, sizeof(sBuffer), sBuffer[iStart + 2]);
					iStart = FindCharInString(sBuffer, '(', false);
					strcopy(sName, sizeof(sName), sBuffer[iStart + 1]);
					int iLength = strlen(sName);
					sName[iLength-1] = 0;
					SplitString(sBuffer, "(", sUpgrade, sizeof(sUpgrade));

					Format(sMessage, sizeof(sMessage), "{unique}[UNLOZE] {lime}%s {white}just recieved {unique}%s {white}as a gift! Thank you for supporting our servers!!!", sName, sUpgrade);
					Format(sMessageWhite, sizeof(sMessageWhite), "%s just recieved %s as a gift! Thank you for supporting our servers!!!", sName, sUpgrade);
				}
			}
		}

		CPrintToChatAll(sMessage);
		for(int client = 1; client <= MaxClients; client++)
		{
			if(IsClientInGame(client))
			{
				PrintHintText(client, sMessageWhite);
			}
		}

		HandleDonation(iID);
		char sQuery[255];
		Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_bdpaygate_log WHERE log_id = %d", iID + 1);
		g_hDatabase.Query(TQueryCB, sQuery, iID + 1);
	}
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void HandleDonation(int iID)
{
	char sDataFile[PLATFORM_MAX_PATH];
	BuildPath(Path_SM, sDataFile, sizeof(sDataFile), "configs/unloze_donation_alert/data.cfg");

	if(!FileExists(sDataFile))
	{
		LogError("Could not find data file: \"%s\"", sDataFile);
		return;
	}

	KeyValues Data = new KeyValues("unloze_donation_alert");

	if(!Data.JumpToKey("last_processed_donation", true))
	{
		LogError("Unable to create section last_processed_donation: \"%s\"",  sDataFile);
		delete Data;
		return;
	}
	Data.SetNum("id", iID);
	Data.Rewind();
	if(!Data.ExportToFile(sDataFile))
	{
		LogError("Unable to export data file: \"%s\"", sDataFile);
		delete Data;
		return;
	}
	delete Data;
}