//=============================================================================
// KFOnlineStatsRead
//=============================================================================
// The KF 2 game stats class that holds and modifies the read stats data
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//  - Joshua Rowan 3/4/2014
//=============================================================================

class KFOnlineStatsRead extends OnlineStatsRead
	native;

`include(KFOnlineStats.uci)

var	KFOnlineStatsWrite		LinkedWriteObject;

var	UniqueNetID OwningUniqueID;
/** Sets when Steam's UserStatsReceived callback triggers. */
var EOnlineEnumerationReadState UserStatsReceivedState;

/** Debugging */
var 		bool 	bLogStatsRead;

function OnStatsInitialized(bool bWasSuccessful)
{
	if( !bWasSuccessful)
	{
		`warn("##########################################################################");
		`warn("KFOnlineStatsRead: Unable to get Steam statistics.  Stats will not be set!");
		`warn("##########################################################################");
	}
	else
	{
		OnReadComplete();
	}
}

native function NativeOnReadComplete();

function OnInventoryReadComplete_Steamworks()
{
	class'GameEngine'.static.GetOnlineSubsystem().ClearOnInventoryReadCompleteDelegate(OnInventoryReadComplete_Steamworks);
	LinkedWriteObject.CheckPerkPSGRewards(None);
}

function OnInventoryReadComplete_Playfab(bool bWasSuccessful)
{
	class'GameEngine'.static.GetPlayfabInterface().ClearInventoryReadCompleteDelegate(OnInventoryReadComplete_Playfab);
	if (bWasSuccessful)
	{
		LinkedWriteObject.CheckPerkPSGRewards(None);
	}
}

event OnReadComplete()
{
	NativeOnReadComplete();
	`log("KFOnlineStatsRead: OnReadComplete called, Rows[0].Columns.Length=" $ Rows[0].Columns.Length @ `showvar(self), bLogStatsRead, 'DevOnline');

	// Grant perk prestige rewards for all perks at their current prestige level, just in case a
	// reward was missed due to network/infrastructure issues. We need to wait for the user's
	// stats AND inventory to be loaded, though, so set a callback for the inventory if necessary.
	//@SABER_EGS IsEosBuild() case added
	if (class'WorldInfo'.static.IsConsoleBuild() || class'WorldInfo'.static.IsEosBuild())
	{
		if (class'GameEngine'.static.GetOnlineSubsystem().CurrentInventory.Length == 0)
		{
			class'GameEngine'.static.GetPlayfabInterface().AddInventoryReadCompleteDelegate(OnInventoryReadComplete_Playfab);
		}
		else
		{
			LinkedWriteObject.CheckPerkPSGRewards(None);
		}
	}
	else
	{
		if (!class'GameEngine'.static.GetOnlineSubsystem().bInventoryReady)
		{
			class'GameEngine'.static.GetOnlineSubsystem().AddOnInventoryReadCompleteDelegate(OnInventoryReadComplete_Steamworks);
		}
		else
		{
			LinkedWriteObject.CheckPerkPSGRewards(None);
		}
	}
}


`if(`notdefined(ShippingPC))
function DumpStats( UniqueNetId ForPlayer )
{
	local int i;
	local string CurrentStringStat;
	local UniqueNetId ZeroId;

	`log("Reading stats for"@class'OnlineSubsystem'.static.UniqueNetIdToString( ForPlayer, false ));

	if( Rows.Length > 0 )
	{
		// This is kind of a hack. If the player ID was never set on the stats, ensure we don't send one so it won't break GetStatValueForPlayerAsString
		if( Rows[0].PlayerId == ZeroId )
		{
			ForPlayer = ZeroId;
		}

		for( i = 0; i < ColumnMappings.Length; i++ )
		{
			if( GetStatValueForPlayerAsString( ForPlayer, ColumnMappings[i].Id, CurrentStringStat) )
			{
				`log("Listing stat"@ColumnMappings[i].Name@"with value"@CurrentStringStat);
			}
			else
			{
				`log("Failed to get stat for Id"@ColumnMappings[i].Id);
			}
		}
	}
	else
	{
		`log("No stats available to dump");
	}
}
`endif

defaultproperties
{
	bLogStatsRead=false
	
	ViewId=VIEWID_KFGameStats

	ColumnIds.Add(STATID_Cmdo_Progress)
	ColumnIds.Add(STATID_Cmdo_Build)
	ColumnIds.Add(STATID_Bsrk_Progress)
	ColumnIds.Add(STATID_Bsrk_Build)
	ColumnIds.Add(STATID_Sup_Progress)
	ColumnIds.Add(STATID_Sup_Build)
	ColumnIds.Add(STATID_Fire_Progress)
	ColumnIds.Add(STATID_Fire_Build)
	ColumnIds.Add(STATID_Medic_Progress)
	ColumnIds.Add(STATID_Medic_Build)
	ColumnIds.Add(STATID_Shrp_Progress)
	ColumnIds.Add(STATID_Shrp_Build)
	ColumnIds.Add(STATID_Demo_Progress)
	ColumnIds.Add(STATID_Demo_Build)
	ColumnIds.Add(STATID_Surv_Progress)
	ColumnIds.Add(STATID_Surv_Build)
	ColumnIds.Add(STATID_Guns_Progress)
	ColumnIds.Add(STATID_Guns_Build)
	ColumnIds.Add(STATID_SWAT_Progress)
	ColumnIds.Add(STATID_SWAT_Build)
	ColumnIds.Add(STATID_Kills)
	ColumnIds.Add(STATID_StalkerKills)
	ColumnIds.Add(STATID_Sup_WeldPoints)
	ColumnIds.Add(STATID_Medic_HealPoints)
	ColumnIds.Add(STATID_CrawlerKills)
	ColumnIds.Add(STATID_FleshpoundKills)
    ColumnIds.Add(STATID_SpecialEventProgress)
    ColumnIds.Add(STATID_WeeklyEventProgress)
    ColumnIds.Add(STATID_DailyEventInfo)
    ColumnIds.Add(STATID_DailyEventIDs)
    ColumnIds.Add(STATID_DailyEventStats1)
    ColumnIds.Add(STATID_DailyEventStats2)
	ColumnIds.Add(STATID_SpecialEventKills_DEPRECATED);
	ColumnIds.Add(STATID_SeasonalEventStats1);
	ColumnIds.Add(STATID_SeasonalEventStats2);
	ColumnIds.Add(STATID_SeasonalEventStats3);
	ColumnIds.Add(STATID_SeasonalEventStats4);
	ColumnIds.Add(STATID_SeasonalEventStats5);
	ColumnIds.Add(STATID_PersonalBest_KnifeKills)
	ColumnIds.Add(STATID_PersonalBest_PistolKills)
	ColumnIds.Add(STATID_PersonalBest_HeadShots)
	ColumnIds.Add(STATID_PersonalBest_Healing)
	ColumnIds.Add(STATID_PersonalBest_Kills)
	ColumnIds.Add(STATID_PersonalBest_Assists)
	ColumnIds.Add(STATID_PersonalBest_LargeZedKill)
	ColumnIds.Add(STATID_PersonalBest_Dosh)
	ColumnIds.Add(STATID_MatchWins)
    ColumnIds.Add(STATID_DoshVaultTotal)
    ColumnIds.Add(STATID_LastViewedDoshVaultTotal)
	ColumnIds.Add(STATID_DoshVaultProgress)
	ColumnIds.Add(STATID_DoshVaultRecovered)

	ColumnMappings.Add((Id=STATID_Cmdo_Progress, Name="CmdoProgress"))
	ColumnMappings.Add((Id=STATID_Cmdo_Build, Name="CmdoBuild"))
	ColumnMappings.Add((Id=STATID_Bsrk_Progress, Name = "BsrkProgress"))
	ColumnMappings.Add((Id=STATID_Bsrk_Build, Name = "BsrkBuild"))
	ColumnMappings.Add((Id=STATID_Sup_Progress, Name = "SupProgress"))
	ColumnMappings.Add((Id=STATID_Sup_Build, Name = "SupBuild"))
	ColumnMappings.Add((Id=STATID_Fire_Progress, Name = "FireProgress"))
	ColumnMappings.Add((Id=STATID_Fire_Build, Name = "FireBuild"))
	ColumnMappings.Add((Id=STATID_Medic_Progress, Name = "MedicProgress"))
	ColumnMappings.Add((Id=STATID_Medic_Build, Name = "MedicBuild"))
	ColumnMappings.Add((Id=STATID_Shrp_Progress, Name = "ShrpProgress"))
	ColumnMappings.Add((Id=STATID_Shrp_Build, Name = "ShrpBuild"))
	ColumnMappings.Add((Id=STATID_Demo_Progress, Name = "DemoProgress"))
	ColumnMappings.Add((Id=STATID_Demo_Build, Name = "DemoBuild"))
	ColumnMappings.Add((Id=STATID_Surv_Progress, Name = "SurvProgress"))
	ColumnMappings.Add((Id=STATID_Surv_Build, Name = "SurvBuild"))
	ColumnMappings.Add((Id=STATID_Guns_Progress, Name = "GunsProgress"))
	ColumnMappings.Add((Id=STATID_Guns_Build, Name = "GunsBuild"))
	ColumnMappings.Add((Id=STATID_SWAT_Progress, Name = "SWATProgress"))
	ColumnMappings.Add((Id=STATID_SWAT_Build, Name = "SWATBuild"))
	ColumnMappings.Add((Id=STATID_Kills, Name = "Kills"))
	ColumnMappings.Add((Id=STATID_StalkerKills, Name = "StalkerKills"))
	ColumnMappings.Add((Id=STATID_Sup_WeldPoints, Name = "SupWeldPoints"))
	ColumnMappings.Add((Id=STATID_Medic_HealPoints, Name = "MedicHealPoints"))
	ColumnMappings.Add((Id=STATID_CrawlerKills, Name = "CrawlerKills"))
	ColumnMappings.Add((Id=STATID_FleshpoundKills, Name = "FleshpoundKills"))
    ColumnMappings.Add((Id=STATID_SpecialEventProgress, Name = "SpecialEventProgress"))
    ColumnMappings.Add((Id=STATID_WeeklyEventProgress, Name = "WeeklyEventProgress"))
    ColumnMappings.Add((Id=STATID_DailyEventInfo, Name="DailyEventProgress"))
    ColumnMappings.Add((Id=STATID_DailyEventIDs, Name="DailyEventIDs"))
    ColumnMappings.Add((Id=STATID_DailyEventStats1, Name="DailyEventStats1"))
    ColumnMappings.Add((Id=STATID_DailyEventStats2, Name="DailyEventStats2"))
	ColumnMappings.Add((Id=STATID_SpecialEventKills_DEPRECATED, Name="SpecialEventKills"))
	ColumnMappings.Add((Id=STATID_SeasonalEventStats1, Name="SeasonalEventStats1"))
	ColumnMappings.Add((Id=STATID_SeasonalEventStats2, Name="SeasonalEventStats2"))
	ColumnMappings.Add((Id=STATID_SeasonalEventStats3, Name="SeasonalEventStats3"))
	ColumnMappings.Add((Id=STATID_SeasonalEventStats4, Name="SeasonalEventStats4"))
	ColumnMappings.Add((Id=STATID_SeasonalEventStats5, Name="SeasonalEventStats5"))
	ColumnMappings.Add((Id=STATID_PersonalBest_KnifeKills, Name = "PersonalBestKnifeKills"))
	ColumnMappings.Add((Id=STATID_PersonalBest_PistolKills, Name = "PersonalBestPistolKills"))
	ColumnMappings.Add((Id=STATID_PersonalBest_HeadShots, Name = "PersonalBestHeadshots"))
	ColumnMappings.Add((Id=STATID_PersonalBest_Healing, Name = "PersonalBestHealing"))
	ColumnMappings.Add((Id=STATID_PersonalBest_Kills, Name = "PersonalBestKills"))
	ColumnMappings.Add((Id=STATID_PersonalBest_Assists, Name = "PersonalBestAssists"))
	ColumnMappings.Add((Id=STATID_PersonalBest_LargeZedKill, Name = "PersonalBestLargeZedKills"))
	ColumnMappings.Add((Id=STATID_PersonalBest_Dosh, Name = "PersonalBestDosh"))
	ColumnMappings.Add((Id=STATID_MatchWins, Name = "MatchWins"))
    ColumnMappings.Add((Id=STATID_DoshVaultTotal, Name="DoshVaultTotal"))
    ColumnMappings.Add((Id=STATID_LastViewedDoshVaultTotal, Name="LastViewedDoshVaultTotal"))
	ColumnMappings.Add((Id=STATID_DoshVaultProgress, Name="DoshVaultProgress"))
	ColumnMappings.Add((Id=STATID_DoshVaultRecovered, Name="DoshVaultRecovered"))
}
