Editor/ConsoleCapture.cs
namespace SboxMcp;

/// <summary>
/// Captures recent Log output so editor.console_output can return it.
/// Appends entries via AddEntry() — call that from any log hook or manually.
/// </summary>
public static class ConsoleCapture
{
	private static readonly List<string> _entries = new();
	private static readonly object _lock = new();
	private const int MaxEntries = 200;
	private static bool _hooked;

	/// <summary>
	/// Call once during addon initialisation to start capturing log output.
	/// Safe to call multiple times — only hooks once.
	/// </summary>
	public static void EnsureHooked()
	{
		if ( _hooked )
			return;
		_hooked = true;

		// s&box Logger does not expose an OnEntry event.
		// Entries are added manually via AddEntry() from handlers.
		Log.Info( "[MCP] ConsoleCapture initialised (manual capture mode)" );
	}

	/// <summary>
	/// Manually append a line (e.g. from ExecutionHandler output).
	/// </summary>
	public static void AddEntry( string line )
	{
		lock ( _lock )
		{
			_entries.Insert( 0, line );
			if ( _entries.Count > MaxEntries )
				_entries.RemoveAt( _entries.Count - 1 );
		}
	}

	/// <summary>
	/// Returns a snapshot of recent log lines (newest-first).
	/// </summary>
	public static List<string> GetRecent()
	{
		lock ( _lock )
		{
			return new List<string>( _entries );
		}
	}

}