UI/Window/GoalWindow.razor
@using Sandbox
@using Sandbox.UI
@using System

@namespace HC3.UI
@inherits Window

<root class="column">
    <tabview>
        @foreach ( var manager in GoalGroups.OrderByDescending( x => x.IsActiveManager ) )
        {
            <tab ShowTitle=@true Icon="@manager.Icon" title="@manager.Title">

                <label class="subtitle">@manager.Description</label>

                <div class="goal-list">
                    @foreach (var goal in manager.GetGoals())
                    {
                        <div class="goal window-container @(goal.IsUnlocked() ? "complete" : "")">
                            <row>
                                <label class="goal-name">@goal.GoalName</label>
                                <div class="grow" />
                                <label class="goal-amount">@GetStatText(goal)</label>
                            </row>

                            @if (!string.IsNullOrEmpty(goal.GoalDescription))
                            {
                                <label class="goal-description">@goal.GoalDescription</label>
                            }
                            <div class="bar">
                                <div class="progress" style="@($"width: {GetStatPercent(goal)}")"></div>
                            </div>

                            @if ( !string.IsNullOrEmpty( goal.GoalReward ) )
                            {
                                <label class="goal-reward subtitle">@goal.GoalReward</label>
                            }
                        </div>
                    }
                </div>
            </tab>
        }
    </tabview>
</root>

@code
{
	public override string Title => "Goals";
	public override object Key => "GoalWindow";
    public override string Icon => "award_star_gold_1";

    public IEnumerable<GoalGroup> GoalGroups => Scene.GetAll<GoalGroup>();

    public GoalGroup Active => GoalGroups.FirstOrDefault( x => x.IsActiveManager );

	string GetStatPercent( Goal goal )
	{
		if (goal == null || goal.StatNeededToComplete <= 0)
			return "0%";

		float percent = MathF.Min(goal.GetStat() / goal.StatNeededToComplete, 1.0f) * 100.0f;
		return $"{percent}%";
	}

	string GetStatText(Goal goal)
	{
		return $"{Math.Min(goal.GetStat(), goal.StatNeededToComplete)} / {goal.StatNeededToComplete}";
	}

	static GoalWindow goalWindow;

	public static void Show()
	{
		if ( goalWindow.IsValid() )
		{
			WindowManager.Instance.Open( goalWindow );
			return;
		}

		goalWindow = new GoalWindow();
		WindowManager.Instance.Open( goalWindow );
		goalWindow.SetPosition( ScreenAlignment.Center );
	}

    public static bool IsOpen => goalWindow.IsValid();

	protected override int BuildHash() => System.HashCode.Combine(Time.Now);
}