World/DoorButton.cs
namespace Causal;

public sealed class DoorButton : Component, Component.IPressable
{
	[Property] public GameObject DoorObject { get; set; }

	private HighlightOutline _highlight;
	private BlastDoor _door;

	protected override void OnStart()
	{
		Component visual = (Component)GetComponent<ModelRenderer>() ?? GetComponent<MeshComponent>();
		if ( !visual.IsValid() )
		{
			Log.Warning( $"DoorButton on '{GameObject.Name}' found no ModelRenderer or MeshComponent." );
		}

		if ( !DoorObject.IsValid() )
		{
			Log.Warning( $"DoorButton on '{GameObject.Name}' has no door GameObject assigned." );
		}
		else
		{
			_door = DoorObject.GetComponent<BlastDoor>() ?? DoorObject.GetComponentInChildren<BlastDoor>();
			if ( !_door.IsValid() )
			{
				Log.Warning( $"DoorButton on '{GameObject.Name}' found no BlastDoor on '{DoorObject.Name}' or its children." );
			}
		}

		_highlight = GetComponent<HighlightOutline>();
		if ( !_highlight.IsValid() )
		{
			Log.Warning( $"DoorButton on '{GameObject.Name}' needs a HighlightOutline for hover feedback." );
		}
		else
		{
			_highlight.Enabled = false;
		}
	}

	public bool CanPress( Component.IPressable.Event e )
	{
		return _door.IsValid() && (!_door.IsOpen || _door.CanClose) && (_door.AllowInterrupt || !_door.IsAnimating);
	}

	public bool Press( Component.IPressable.Event e )
	{
		if ( !CanPress( e ) )
		{
			return false;
		}

		_door.Toggle();
		return true;
	}

	public bool Pressing( Component.IPressable.Event e )
	{
		return true;
	}

	public void Release( Component.IPressable.Event e )
	{
	}

	public void Hover( Component.IPressable.Event e )
	{
		if ( _highlight.IsValid() )
		{
			_highlight.Enabled = true;
		}
	}

	public void Look( Component.IPressable.Event e )
	{
	}

	public void Blur( Component.IPressable.Event e )
	{
		if ( _highlight.IsValid() )
		{
			_highlight.Enabled = false;
		}
	}

	public Component.IPressable.Tooltip? GetTooltip( Component.IPressable.Event e )
	{
		if ( !_door.IsValid() )
		{
			return null;
		}

		string title = _door.IsOpen && _door.CanClose ? "Close" : "Open";
		return new Component.IPressable.Tooltip( title, "", "", true, this );
	}
}