HQ/HqNavigator.cs
using Sandbox.Utility;

namespace PlanetMeat;

[Group( "Planet Meat - HQ" ), Title( "HQ Navigator" ), Icon( "explore" )]
public sealed class HqNavigator : Component
{
	public static HqNavigator Local
	{
		get;
		private set
		{
			field = value;
			value?.AppliedView = View;
		}
	}

	public enum Views { None, Research, Improve, Mission };

	public DelayedRelocate Relocator => field ??= Components.Get<DelayedRelocate>();
	[Property] public GameObject AnchorNone { get; set; }
	[Property] public GameObject AnchorResearch { get; set; }
	[Property] public GameObject AnchorImprove { get; set; }
	[Property] public GameObject AnchorMission { get; set; }

	public static Views View
	{
		get;
		set
		{
			field = value;
			Local?.AppliedView = View;
		}
	}

	private Views AppliedView
	{
		set
		{
			if ( Agenda.Current.Phase != Agenda.Phases.Startup )
				Career.Current.CommitRunStats();

			field = value;

			switch ( value )
			{
				case Views.Research:
					Catalogue.Current.CurrentTab = "research";
					camLerpEnd = AnchorResearch.WorldTransform;
					break;
				case Views.Improve:
					Catalogue.Current.CurrentTab = "improve";
					camLerpEnd = AnchorImprove.WorldTransform;
					break;
				case Views.Mission:
					Catalogue.Current.CurrentTab = "";
					camLerpEnd = AnchorMission.WorldTransform;
					break;
				default:
					Catalogue.Current.CurrentTab = "";
					camLerpEnd = AnchorNone.WorldTransform;
					break;
			}
			camLerpStart = Scene.Camera.WorldTransform;
			lerpProgress = 0.0f;
		}
	} = Views.None;
	public static bool ShopVisible => View == Views.Research || View == Views.Improve;
	public static bool MissionVisible => View == Views.Mission;
	public static bool ExplainerVisible => View != Views.None;
	public static bool StatsVisible => View == Views.None;

	public static string GetViewDisplayName( Views view ) => view switch
	{
		Views.Research => "toolbox.research.title",
		Views.Improve => "toolbox.improve.title",
		Views.Mission => "toolbox.mission.title",
		_ => ""
	};

	public static string GetViewDisplayIcon( Views view ) => view switch
	{
		Views.Research => "biotech",
		Views.Improve => "plumbing",
		Views.Mission => "settings_input_antenna",
		_ => ""
	};

	public static string GetViewExplainerText( Views view ) => view switch
	{
		Views.Research => "hq.research.desc",
		Views.Improve => "hq.improve.desc",
		Views.Mission => "hq.mission.desc",
		_ => ""
	};

	private Transform camLerpStart;
	private Transform camLerpEnd;
	private float lerpProgress;

	protected override void OnStart()
	{
		base.OnStart();
		Local = this;
	}

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

		if ( lerpProgress < 1.0f )
		{
			lerpProgress += Time.Delta;
			if ( lerpProgress > 0.99f )
			{
				lerpProgress = 2.0f;
				Scene.Camera.WorldTransform = camLerpEnd;
			}
			else
			{
				Scene.Camera.WorldTransform = camLerpStart.LerpTo( camLerpEnd, Easing.SineEaseInOut( lerpProgress ) );
			}
		}
	}

	protected override void OnDestroy()
	{
		Local = null;
		base.OnDestroy();
	}
}