UI/PauseMenu.razor
@using System;
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent

<root class="pause-root @(IsOpen ? "open" : "closed")">

	@if (
		IsOpen &&
		RoundManager is not null &&
		RoundManager.Mode != SessionMode.Menu
	)
	{
		<div class="pause-screen">
			<div class="pause-screen-overlay"></div>

			<div class="pause-panel">
				<div class="pause-panel-chrome"></div>

				@if ( _page == PausePage.Main )
				{
					<div class="pause-eyebrow">
						@(RoundManager.Mode == SessionMode.Sandbox ? "SANDBOX" : "ONLINE 1V1")
					</div>

					<div class="pause-title">
						@(RoundManager.Mode == SessionMode.Sandbox ? "TEST MENU" : "PAUSED")
					</div>

					@if ( RoundManager.Mode == SessionMode.Match )
					{
						<div class="pause-note">
							The online match continues while this menu is open.
						</div>
					}
					else
					{
						<div class="pause-summary">
							<div>A: @RoundManager.GetSandboxWeaponName( 0 )</div>
							<div>B: @RoundManager.GetSandboxWeaponName( 1 )</div>
						</div>
					}

					<div class="pause-actions">

						<div class="pause-button primary" onclick=@Resume>
							<div class="pause-button-title">RESUME</div>
						</div>

						<div class="pause-button" onclick=@OpenSettings>
							<div class="pause-button-title">SETTINGS</div>
							<div class="pause-button-copy">Sensitivity, FOV and movement preferences</div>
						</div>

						@if (
							RoundManager.Mode ==
								SessionMode.Sandbox &&
							Networking.IsHost
						)
						{
							<div class="pause-button" onclick=@ResetSandboxPlayers>
								<div class="pause-button-title">RESET PLAYERS</div>
								<div class="pause-button-copy">Re-apply current arena and loadouts</div>
							</div>

							@if ( RoundManager.SandboxBotEnabled )
							{
								<div class="pause-button" onclick=@ResetSandboxBot>
									<div class="pause-button-title">RESET BOT</div>
									<div class="pause-button-copy">Respawn and re-equip only the sandbox bot</div>
								</div>
							}

							<div class="pause-button" onclick=@OpenSandboxSetup>
								<div class="pause-button-title">SANDBOX SETUP</div>
								<div class="pause-button-copy">Change weapons or arena without disconnecting</div>
							</div>
						}

						<div class="pause-button danger" onclick=@LeaveSession>
							<div class="pause-button-title">
								@(RoundManager.Mode == SessionMode.Sandbox ? "RETURN TO MAIN MENU" : "LEAVE MATCH")
							</div>
						</div>

					</div>
				}
				else
				{
					<div class="pause-eyebrow">OPTIONS</div>
					<div class="pause-title">SETTINGS</div>

					<SettingsPanel />

					<div class="pause-settings-back" onclick=@BackFromSettings>
						BACK
					</div>
				}

			</div>

		</div>
	}

</root>

@code
{
	public static PauseMenu Current { get; private set; }

	public static bool IsAnyPauseOpen =>
		Current?.
			IsOpen ??
		false;

	[Property]
	public RoundManager RoundManager { get; set; }

	[Property, Group( "UI Foundation" ), Title( "Theme" )]
	public OMRUITheme Theme { get; set; }

	[Property, Group( "UI Foundation" ), Title( "Menu Layout" )]
	public OMRMainMenuLayout MenuLayout { get; set; }

	private OMRUITheme ActiveTheme =>
		Theme ?? OMRUIResources.DefaultTheme;

	private OMRMainMenuLayout ActiveMenuLayout =>
		MenuLayout ?? OMRUIResources.DefaultMenuLayout;

	private GameFlowManager FlowManager =>
		RoundManager?.
			GameObject?.
			Components
			.Get<GameFlowManager>();

	private enum PausePage
	{
		Main,
		Settings
	}

	public bool IsOpen { get; private set; }

	private PausePage _page =
		PausePage.Main;

	private SessionMode _lastMode =
		SessionMode.Menu;

	protected override void OnEnabled()
	{
		base.OnEnabled();

		Current =
			this;
	}

	protected override void OnDisabled()
	{
		if ( Current == this )
		{
			Current =
				null;
		}

		base.OnDisabled();
	}

	protected override void OnStart()
	{
		base.OnStart();

		RoundManager ??=
			Components.Get<RoundManager>();

		if ( RoundManager is not null )
		{
			_lastMode =
				RoundManager.Mode;
		}
	}

	protected override void OnUpdate()
	{
		base.OnUpdate();

		RoundManager ??=
			Components.Get<RoundManager>();

		if ( IsOpen )
		{
			OMRUIRuntimeStyle.ApplyPause(
				Panel,
				ActiveTheme,
				ActiveMenuLayout
			);
		}

		if ( RoundManager is null )
			return;

		if (
			RoundManager.Mode !=
				_lastMode
		)
		{
			if (
				RoundManager.Mode ==
					SessionMode.Menu
			)
			{
				CloseWithoutControlRestore();
			}

			_lastMode =
				RoundManager.Mode;
		}

		if (
			RoundManager.Mode !=
				SessionMode.Menu &&
			Input.EscapePressed
		)
		{
			if (
				IsOpen &&
				_page ==
					PausePage.Settings
			)
			{
				_page =
					PausePage.Main;

				return;
			}

			SetOpen(
				!IsOpen
			);
		}

		if ( !IsOpen )
			return;

		Mouse.Visibility =
			MouseVisibility.Visible;

		Input.EnableVirtualCursor =
			true;
	}

	private void SetOpen(
		bool open
	)
	{
		if (
			RoundManager is null ||
			RoundManager.Mode ==
				SessionMode.Menu
		)
			return;

		if (
			IsOpen ==
				open
		)
			return;

		IsOpen =
			open;

		_page =
			PausePage.Main;

		RoundManager.RequestPauseState(
			open
		);
	}

	private void CloseWithoutControlRestore()
	{
		IsOpen =
			false;

		_page =
			PausePage.Main;
	}

	private void Resume()
	{
		SetOpen(
			false
		);
	}

	private void OpenSettings()
	{
		_page =
			PausePage.Settings;
	}

	private void BackFromSettings()
	{
		_page =
			PausePage.Main;
	}

	private void ResetSandboxPlayers()
	{
		if (
			RoundManager is null ||
			RoundManager.Mode !=
				SessionMode.Sandbox ||
			!Networking.IsHost
		)
			return;

		RoundManager.ResetSandboxPlayersNow();

		SetOpen(
			false
		);
	}

	private void ResetSandboxBot()
	{
		if (
			RoundManager is null ||
			RoundManager.Mode !=
				SessionMode.Sandbox ||
			!Networking.IsHost
		)
			return;

		RoundManager.ResetSandboxBotNow();

		SetOpen(
			false
		);
	}

	private void OpenSandboxSetup()
	{
		if (
			RoundManager is null ||
			RoundManager.Mode !=
				SessionMode.Sandbox ||
			!Networking.IsHost
		)
			return;

		CloseWithoutControlRestore();

		if (
			MainMenuHost.Current is not null
		)
		{
			MainMenuHost.Current
				.ReturnToSandboxSetup();

			return;
		}

		FlowManager?.
			ReturnToSandboxSetup();
	}

	private void LeaveSession()
	{
		if ( RoundManager is null )
			return;

		CloseWithoutControlRestore();

		if (
			MainMenuHost.Current is not null
		)
		{
			MainMenuHost.Current
				.ReturnToMainMenu();

			return;
		}

		FlowManager?.
			ReturnToMainMenu();
	}

	protected override int BuildHash()
	{
		HashCode hash =
			new();

		hash.Add(
			IsOpen
		);

		hash.Add(
			_page
		);

		hash.Add(
			RoundManager?.
				Mode
		);

		hash.Add( ActiveTheme?.ContentHash() ?? 0 );
		hash.Add( ActiveMenuLayout?.ContentHash() ?? 0 );

		if (
			RoundManager is not null &&
			RoundManager.Mode ==
				SessionMode.Sandbox
		)
		{
			hash.Add(
				RoundManager.SandboxWeaponAIndex
			);

			hash.Add(
				RoundManager.SandboxWeaponBIndex
			);
		}

		return hash.ToHashCode();
	}
}