#include <sourcemod>
#include <SteamWorks>
#include <json>
#include <cstrike>

public Plugin myinfo =
{
	name			= "Racetimer Rank",
	author			= "jenz",
	description		= "Give racetimer points as a level clan tag to players",
	version			= "1.0",
	url				= ""
};

public void OnPluginStart()
{
	for(int client = 1; client <= MaxClients; client++)
	{
		if(IsClientInGame(client))
		{
			OnClientPostAdminFilter(client);
		}
	}
}

public void OnClientPostAdminFilter(int client)
{
    if(!IsClientAuthorized(client) || IsFakeClient(client) || IsClientSourceTV(client))
        return;

    if (!HasClanTag(client))
    {
        check_client_racetimer_rank(client);
    }
}

public bool HasClanTag(int client)
{
    char sClanID[32];
    GetClientInfo(client, "cl_clanid", sClanID, sizeof(sClanID));
    return strlen(sClanID) > 1; //without a tag the len is 1.
}

public void check_client_racetimer_rank(int client)
{
    char sSID[64];
    char sRequest[256];
    GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
    FormatEx(sRequest, sizeof(sRequest), "https://racebackend.unloze.com/racetimer_endpoints-1.0/api/timers/player/%s", sSID);
    
    Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodGET, sRequest);
    if (!hRequest ||
        !SteamWorks_SetHTTPCallbacks(hRequest, OnTransferComplete) ||
        !SteamWorks_SetHTTPRequestContextValue(hRequest, GetClientSerial(client)) ||
        !SteamWorks_SendHTTPRequest(hRequest))
    {
        delete hRequest;
    }
}

public int OnTransferComplete(Handle hRequest, bool bFailure, bool bSuccessful, EHTTPStatusCode eStatusCode, int iSerial)
{
    int client = GetClientFromSerial(iSerial);
    if (!client) //Player disconnected.
    {
        delete hRequest;
        return 0;
    }

    if (bFailure || !bSuccessful || eStatusCode != k_EHTTPStatusCode200OK)
    {
        delete hRequest;
        LogError("Request-Error: %d", eStatusCode);
        return 0;
    }

    SteamWorks_GetHTTPResponseBodyCallback(hRequest, OnTransferResponse, iSerial);
    return 0;
}

public int OnTransferResponse(char[] sData, int iSerial)
{
    int client = GetClientFromSerial(iSerial);
    if (!client) //Player disconnected.
    {
        return 0;
    }

    JSON_Object obj = json_decode(sData); //https://github.com/clugg/sm-json
    
    int I_player_points = obj.GetInt("PlayerPoints") //if no endpoint for steamID default value is -1
    if (I_player_points < 1000)
    {
        I_player_points = 1000; //setting level 1
    }
    char tag[64];
    Format(tag, sizeof(tag), "[LVL %i]", I_player_points/1000);
    CS_SetClientClanTag(client, tag);
    json_cleanup_and_delete(obj);
    return 0;
}