UI/SpawnMenu/Spawnlists/SpawnlistsPage.cs
using Sandbox.UI;

namespace Sandbox;

/// <summary>
/// Top-level spawn menu tab for user-created spawnlists.
/// </summary>
[Title( "#spawnmenu.tab.spawnlists" ), Order( 1000 ), Icon( "📋" )]
public class SpawnlistsPage : BaseSpawnMenu
{
	public SpawnlistCollection Collection { get; } = new();

	public SpawnlistsPage()
	{
		Collection.Changed += () =>
		{
			if ( Collection.Entries.Count == 0 )
				_firstViewed = false;

			OnParametersSet();
		};
		Collection.Installed += name =>
		{
			OnParametersSet();
			SelectOption( name );
		};
		Collection.Uninstalled += () =>
		{
			DeselectOption();
			OnParametersSet();
		};
		SpawnlistData.SpawnlistCreated += Collection.Refresh;
		Collection.Refresh();
	}

	protected override void Rebuild()
	{
		if ( Collection.Entries.Count > 0 || Collection.PendingCount > 0 )
		{
			AddHeader( "#spawnmenu.section.local" );

			foreach ( var entry in Collection.Entries )
			{
				var captured = entry;
				AddOption( entry.Icon, entry.Name,
					() => new SpawnlistView { Entry = captured.StorageEntry },
					entry.IsEditable
						? () => OnEditableRightClick( captured )
						: () => OnInstalledRightClick( captured ) );
			}

			AddSkeletons( Collection.PendingCount );
		}

		AddHeader( "#spawnmenu.section.workshop" );
		AddOption( "🎖️", "#spawnmenu.spawnlist.popular", () => new SpawnlistWorkshop { SortOrder = WorkshopSortMode.Popular } );
		AddOption( "🐣", "#spawnmenu.spawnlist.newest", () => new SpawnlistWorkshop { SortOrder = WorkshopSortMode.Newest } );
	}

	protected override void OnMenuFooter( Panel footer )
	{
		footer.AddChild<SpawnlistFooter>();
	}

	/// <summary>Refresh after external changes (create, etc.).</summary>
	public void RefreshList() => Collection.Refresh();

	void OnEditableRightClick( SpawnlistCollection.Entry entry )
	{
		var menu = MenuPanel.Open( this );

		menu.AddOption( "edit", "#spawnmenu.spawnlist.rename", () =>
		{
			var data = SpawnlistData.Load( entry.StorageEntry );
			var popup = new StringQueryPopup
			{
				Title = "#spawnmenu.spawnlist.rename_title",
				Prompt = "#spawnmenu.spawnlist.rename_prompt",
				Placeholder = "#spawnmenu.spawnlist.name_placeholder",
				ConfirmLabel = "#spawnmenu.spawnlist.rename_button",
				InitialValue = data.Name,
				OnConfirm = newName =>
				{
					SpawnlistData.Rename( entry.StorageEntry, newName );
					Collection.Refresh();
				}
			};
			popup.Parent = FindPopupPanel();
		} );

		menu.AddOption( "delete", "#spawnmenu.spawnlist.delete", () => Collection.Delete( entry.StorageEntry ) );
	}

	void OnInstalledRightClick( SpawnlistCollection.Entry entry )
	{
		var menu = MenuPanel.Open( this );
		menu.AddOption( "delete", "#spawnmenu.spawnlist.remove", () => Collection.Uninstall( entry.WorkshopId ) );
	}
}