UI/HQ/Elements/CampaignStatsReadout.razor
@using Sandbox.UI;
@using System;
@inherits Panel
@namespace PlanetMeat

<root>
	@{
		<div class="game-title">
			<span>#game.by.title</span>
		</div>
		<div class="game-by">
			<span>#game.by.alxl</span>
		</div>
		<div></div>
		var ctx = Career.Current.CareerStats;
		<div class="category">
			@{
				var (myAllDmg, globalAllDmg) = GetDamageText(ctx, "all");
				<span class="title key">#stats.dmg.all</span>
				<span class="value">@myAllDmg</span>
				<span class="value">@globalAllDmg</span>
			}
			@foreach (var tool in Catalogue.Current.BlameTools)
			{
				var (myDmg, globalDmg) = GetDamageText(ctx, "by_" + tool);
				if (myDmg != "" && globalDmg != "")
				{
					<span class="key">#tool.@(tool).title</span>
					<span class="value">@myDmg</span>
					<span class="value">@globalDmg</span>
				}
			}
		</div>

		@foreach (var (header, headerStat, statPrefix, statIter, getDisplayName) in Categories)
		{
			var (myHeadStat, globalHeadStat) = GetGenericText(ctx, headerStat);
			<div class="category">
				<span class="title key">#stats.@header</span>
				<span class="value">@myHeadStat</span>
				<span class="value">@globalHeadStat</span>
				@foreach (var stat in statIter)
				{
					var (myStat, globalStat) = GetGenericText(ctx, statPrefix + stat);
					if (myStat != "" && globalStat != "")
					{
						<span class="key">#@(getDisplayName.Invoke(stat))</span>
						<span class="value">@myStat</span>
						<span class="value">@globalStat</span>
					}
				}
			</div>
		}

		<div class="category">
			@{
				var (myBank, globalBank) = GetDamageText(ctx, "meat_banked");
				<span class="title key">#stats.meat.banked</span>
				<span class="value">@myBank</span>
				<span class="value">@globalBank</span>

				var (myLosses, globalLosses) = GetDamageText(ctx, "meat_lost");
				<span class="key">#stats.meat.lost</span>
				<span class="value">@myLosses</span>
				<span class="value">@globalLosses</span>

				var (myWins, globalWins) = GetDamageText(ctx, "runs_banked");
				<span class="key">#stats.runs.banked</span>
				<span class="value">@myWins</span>
				<span class="value">@globalWins</span>

				var (myRounds, globalRounds) = GetDamageText(ctx, "round");
				<span class="key">#stats.rounds.passed</span>
				<span class="value">@myRounds</span>
				<span class="value">@globalRounds</span>
			}
		</div>

		<div class="category">
			@{
				var (mySpent, globalSpent) = GetDamageText(ctx, "meat_spent");
				<span class="title key">#stats.meat.spent</span>
				<span class="value">@mySpent</span>
				<span class="value">@globalSpent</span>

				var (myImps, globalImps) = GetDamageText(ctx, "improvements");
				<span class="key">#stats.improvements.bought</span>
				<span class="value">@myImps</span>
				<span class="value">@globalImps</span>

				var (myTechs, globalTechs) = GetDamageText(ctx, "tech");
				<span class="key">#stats.tech.researched</span>
				<span class="value">@myTechs</span>
				<span class="value">@globalTechs</span>
			}
		</div>

		<div></div>
		<div></div>
		<div class="hint">
			<span>#stats.hint</span>
		</div>
	}
</root>

@code
{
	private IEnumerable<(string, string, string, IEnumerable<string>, Func<string, string>)> Categories => field ??= [
		("kill_weps.all", "wep_kills", "kills_by_", Catalogue.Current.BlameTools, (t) => "tool." + t + ".title"),
		("kill_types.all", "kills_all", "kills_", Agenda.Current.AllVariantIdents, EnemyVariant.GetDisplayName),
		("runs.lost", "runs_lost", "defeated_by_", Agenda.Current.AllVariantIdents, EnemyVariant.GetDisplayName),
	];

	private static string GetDamageString(double dmg, double overkill) => LargeNumberString.ToCompact(dmg - overkill) + " · " + LargeNumberString.ToCompact(overkill);

	private (string, string) GetDamageText(StatContext ctx, string scope)
	{
		var dmgIdent = "damage_" + scope;
		var overkillIdent = "overkill_" + scope;

		var myDmg = ctx.GetNow(dmgIdent);
		var myOverkill = ctx.GetNow(overkillIdent);
		var worldDmg = Career.GetGlobalStat(dmgIdent);
		var worldOverkill = Career.GetGlobalStat(overkillIdent);

		return (GetDamageString(myDmg, myOverkill), "(" + GetDamageString(worldDmg, worldOverkill) + ")");
	}

	private (string, string) GetGenericText(StatContext ctx, string ident)
	{
		var me = ctx.GetNow(ident);
		var world = Career.GetGlobalStat(ident);

		return (LargeNumberString.ToCompact(me), "(" + LargeNumberString.ToCompact(world) + ")");
	}

	protected override int BuildHash() => HashCode.Combine(
		HqNavigator.View
	);
}