UI/TrackBuilder/TrackBuilderWindow.razor
@using System
@using Sandbox
@using Sandbox.UI
@using HC3
@using HC3.Rides

@namespace HC3.UI
@inherits Window

@if (TrackBuilder.Instance?.IsBuilding is not true)
{
    Close();
    return;
}

<root>
    <div class="column">
        <div class="header">Direction</div>
        <div class="row">
            <div class="button @(TrackBuilder.CanFilter(TrackFeature.Station) ? "enabled" : "disabled") @(TrackBuilder.Filter.Feature == TrackFeature.Station ? "selected" : "")"
            tooltip="@TrackFeature.Station.ToString().ToTitleCase()"
            onclick="@(() => TrackBuilder.ToggleFilter(TrackFeature.Station))">
                <i>home</i>
            </div>
            <div class="divider"></div>
            @foreach ( var direction in TrackBuilder.AllDirections )
            {
                <div class="button @(TrackBuilder.CanFilter(direction) ? "enabled" : "disabled") @(TrackBuilder.Filter.Direction == direction ? "selected" : "")"
                tooltip="@direction.ToString().ToTitleCase()"
                onclick="@(() => TrackBuilder.SetFilter( direction ))">
                    <i>@GetDirectionIcon( direction )</i>
                </div>
            }
            <div class="divider"></div>
            <div class="button @(TrackBuilder.CanFilter(TrackFeature.ChainLift) ? "enabled" : "disabled") @(TrackBuilder.Filter.Feature == TrackFeature.ChainLift ? "selected" : "")"
            tooltip="@TrackFeature.ChainLift.ToString().ToTitleCase()"
            onclick="@(() => TrackBuilder.ToggleFilter(TrackFeature.ChainLift))">
                <i>link</i>
            </div>
        </div>
        <div class="divider"></div>
        <div class="header">Banking</div>
        <div class="row">
            @foreach ( var banking in TrackBuilder.AllBanking )
            {
                <div class="button @(TrackBuilder.CanFilter(banking) ? "enabled" : "disabled") @(TrackBuilder.Filter.Banking == banking ? "selected" : "")"
                tooltip="@banking.ToString().ToTitleCase() (@banking.Roll()°)"
                onclick="@(() => TrackBuilder.SetFilter( banking ))">
                    <i style="transform: rotate(@banking.Roll()deg)">directions_car</i>
                </div>
            }
        </div>
        <div class="divider"></div>
        <div class="header">Incline</div>
        <div class="row">
            @foreach (var incline in TrackBuilder.AllInclines)
            {
                <div class="button @(TrackBuilder.CanFilter(incline) ? "enabled" : "disabled") @(TrackBuilder.Filter.Incline == incline ? "selected" : "")"
                tooltip="@incline.ToString().ToTitleCase() (@incline.Pitch().ToString("F0")°)"
                onclick="@(() => TrackBuilder.SetFilter( incline ))">
                    <i style="transform: rotate(@incline.Pitch()deg)">arrow_right_alt</i>
                </div>
            }
        </div>
        <div class="divider"></div>
        <div class="row">
            @if (TrackBuilder.Filter.Feature == TrackFeature.Special)
            {
                foreach (var element in TrackBuilder.PossibleSpecialElements)
                {
                    <div class="button element @(TrackBuilder.SpecialElement == element ? "selected" : "")" onclick="@( () => TrackBuilder.SpecialElement = element )">
                        <label>@element.Title</label>
                    </div>
                }
            }
            else
            {
                foreach (var size in TrackBuilder.AllSizes)
                {
                    <div class="button element @(TrackBuilder.Size == size ? "selected" : "")" onclick="@( () => TrackBuilder.Size = size )">
                        <label>@size</label>
                    </div>
                }
            }
        </div>
        <div class="row">
            <div class="button @(TrackBuilder.CanFilter(TrackFeature.Special) ? "enabled" : "disabled")" onclick="@(() => TrackBuilder.ToggleFilter(TrackFeature.Special))"><i>star</i></div>
            <div class="button build" onclick="@(() => TrackBuilder.Build())">Build</div>
			<div class="button" onclick="@(() => TrackBuilder.Demolish())"><i>backspace</i></div>
		</div>
	</div>
</root>

@code
{
#nullable enable

	public TrackBuilder TrackBuilder => TrackBuilder.Instance ?? throw new Exception( "Not currently building track." );

	public TrackRide? Ride => TrackBuilder.SelectedRide;

	public TrackSection Section => TrackBuilder.SelectedSection ?? throw new Exception( "Not currently building track." );

	public override string Title => $"{(string.IsNullOrEmpty( Ride?.CustomTitle ) ? Ride?.Title : Ride?.CustomTitle) ?? "Track"} Builder";
	public override string Icon => Ride?.BuildingType.GetAttributeOfType<IconAttribute>()?.Value ?? "build";
	public override object? Key => TrackBuilder.Instance;

	private string GetDirectionIcon( TurnDirection dir )
	{
		var enumDesc = TypeLibrary.GetEnumDescription( typeof(TurnDirection) );

		return enumDesc.GetEntry( dir ).Icon;
	}

	public override void OnClose()
	{
		base.OnClose();

        TrackBuilder.ClearSelection();
	}

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