Editor/InteriorLayoutBuilder/RoomLayoutTool.SelectionOptions.cs
using System.Collections.Generic;
using System.Linq;

namespace ReusableRoomLayout;

public sealed partial class RoomLayoutTool
{
	public bool HasSelectableLayoutItems =>
		document.Rooms.Count > 0 ||
		document.Doors.Count > 0 ||
		document.Windows.Count > 0 ||
		document.Corridors.Count > 0 ||
		document.FloorCutouts.Count > 0;

	public IEnumerable<RoomLayoutSelectionOption> GetSelectionOptions()
	{
		foreach ( var room in document.Rooms.OrderBy( room => document.FloorFor( room ) ).ThenBy( room => room.Id ) )
		{
			var name = string.IsNullOrWhiteSpace( room.Name ) ? $"Room {room.Id}" : room.Name;
			yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Room, room.Id, $"{FloorLabel( document.FloorFor( room ) )}: {name}", "crop_square" );
		}

		foreach ( var door in document.Doors.OrderBy( door => document.FloorFor( door ) ).ThenBy( door => door.Id ) )
		{
			yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Door, door.Id, $"{FloorLabel( document.FloorFor( door ) )}: Door {door.Id}", "door_front" );
		}

		foreach ( var window in document.Windows.OrderBy( window => document.FloorFor( window ) ).ThenBy( window => window.Id ) )
		{
			yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Window, window.Id, $"{FloorLabel( document.FloorFor( window ) )}: Window {window.Id}", "window" );
		}

		foreach ( var corridor in document.Corridors.OrderBy( corridor => document.FloorFor( corridor ) ).ThenBy( corridor => corridor.Id ) )
		{
			yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Corridor, corridor.Id, $"{FloorLabel( document.FloorFor( corridor ) )}: Corridor {corridor.Id}", "timeline" );
		}

		foreach ( var cutout in document.FloorCutouts.OrderBy( cutout => document.FloorFor( cutout ) ).ThenBy( cutout => cutout.Id ) )
		{
			var name = string.IsNullOrWhiteSpace( cutout.Name ) ? $"Floor Cutout {cutout.Id}" : cutout.Name;
			yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.FloorCutout, cutout.Id, $"{FloorLabel( document.FloorFor( cutout ) )}: {name}", "stairs" );
		}
	}

	public void SelectLayout( RoomLayoutSelectionKind kind, int id )
	{
		selectedRoomId = 0;
		selectedDoorId = 0;
		selectedWindowId = 0;
		selectedCorridorId = 0;
		selectedFloorCutoutId = 0;

		switch ( kind )
		{
			case RoomLayoutSelectionKind.Room when document.FindRoom( id ) is not null:
				selectedRoomId = id;
				SetActiveFloorFromSelection();
				break;
			case RoomLayoutSelectionKind.Door when document.FindDoor( id ) is { } door:
				selectedRoomId = door.RoomId;
				selectedDoorId = id;
				SetActiveFloorFromSelection();
				break;
			case RoomLayoutSelectionKind.Window when document.FindWindow( id ) is { } window:
				selectedRoomId = window.RoomId;
				selectedWindowId = id;
				SetActiveFloorFromSelection();
				break;
			case RoomLayoutSelectionKind.Corridor when document.Corridors.Any( corridor => corridor.Id == id ):
				selectedCorridorId = id;
				SetActiveFloorFromSelection();
				break;
			case RoomLayoutSelectionKind.FloorCutout when document.FloorCutouts.Any( cutout => cutout.Id == id ):
				selectedFloorCutoutId = id;
				SetActiveFloorFromSelection();
				break;
		}
	}
}

public enum RoomLayoutSelectionKind
{
	Room,
	Door,
	Window,
	Corridor,
	FloorCutout
}

public readonly record struct RoomLayoutSelectionOption(
	RoomLayoutSelectionKind Kind,
	int Id,
	string Name,
	string Icon );