ui/LeaderboardPanel.razor
@using Sandbox;
@using Sandbox.UI;
@inherits Panel
@attribute [StyleSheet("LeaderboardPanel.razor.scss")]

<root>
	@if(Leaderboard is null) return;

	@* <div class="upper"> *@
		@* <label class="header">Leaderboard</label> *@

		@if(Leaderboard.Entries.Count() > 0)
		{
			var offset = 0;
			var rowNum = 0;

			<div class="entries">
				@foreach(var entry in Leaderboard.Entries)
				{
					@if(entry.Value <= 1f)
					{
						offset++;
						continue;
					}

					float scorePerLevel = 1000000f;

					int levelsBeat = 10 - MathX.FloorToInt((float)entry.Value / scorePerLevel);
					float runTime = (float)entry.Value - (MathX.FloorToInt((float)entry.Value / scorePerLevel) * scorePerLevel);
					TimeSpan time = TimeSpan.FromSeconds(runTime);
					string timeString = time.TotalSeconds > 3600 ? time.ToString(@"hh\:mm\:ss") : time.ToString(@"mm\:ss");

					string lvlString = levelsBeat == 10 ? "Victory" : $"Beat {levelsBeat}/10 Levels";
					string valueStr = $"{lvlString} in {timeString}";

					var nameStr = entry.DisplayName.Length > 32 ? $"{entry.DisplayName.Truncate(32)}..." : entry.DisplayName;

					<div class="entry @(rowNum % 2 == 0 ? "even_row" : "odd_row")">
						<label class="rank">##@(entry.Rank - offset)</label>
						<label class="name">@nameStr</label>
						<label class="@(levelsBeat == 10 ? "value_victory" : "value")">@valueStr</label>
					</div>

					rowNum++;
				}
			</div>
		}
	@* </div> *@

	<div class="button" style="margin-top: 20px;" onmouseover=@(() => OnMouseOverButton() ) onclick=@(() => BackButtonClicked() )>
		<div class="button_icon" style="background-image:url(@($"textures/ui_x_border.png"));"></div>
		<div class="button_text">Back</div>
	</div>
</root>

@code
{
	Sandbox.Services.Leaderboards.Board2 Leaderboard;

	protected override void OnAfterTreeRender(bool firstTime)
	{
		base.OnAfterTreeRender(firstTime);

		if(firstTime)
		{
			Leaderboard = Sandbox.Services.Leaderboards.GetFromStat("facepunch.memory", "total_score");
			Refresh();
		}
	}

	async void Refresh()
	{
		Leaderboard.SetAggregationMin(); // select the lowest value from each player
		Leaderboard.SetSortAscending(); // order by the lowest value first
		Leaderboard.CenterOnMe(); // offset so I'm in the middle of the results
		Leaderboard.MaxEntries = 500;

		await Leaderboard.Refresh();

		// foreach(var entry in Leaderboard.Entries)
		// {
		// 	Log.Info($"{entry.Rank} - {entry.DisplayName} - {entry.Value} [{entry.Timestamp}]");
		// }

		StateHasChanged();
	}

	public void BackButtonClicked()
	{
		Manager.Instance.PlaySfx("click_0");

		Manager.Instance.IsLeaderboardOpen = false;

	}

	void OnMouseOverButton()
	{
		Manager.Instance.PlaySfx("click_1");
	}
}