using System.Linq;
using System.Text.RegularExpressions;
using UnityEngine;
using Object = UnityEngine.Object;
namespace LLM.Editor.Analysis
{
///
/// Provides a list of GameObjects found in the current scene based on a query.
/// Supports searching by name (with wildcards), component type, or tag.
///
public class FindInSceneProvider : IContextProvider
{
public class SceneQueryResult
{
public string name;
public string id;
}
public object GetContext(Object target, string qualifier)
{
if (string.IsNullOrEmpty(qualifier))
{
return "Error: A query string (qualifier) is required for FindInScene (e.g., 'name: Player', 'component: Rigidbody', 'tag: Enemy').";
}
var gameObjects = Object.FindObjectsOfType();
var queryParts = qualifier.Split(new[] { ':' }, 2);
var queryType = queryParts[0].Trim().ToLower();
var queryValue = queryParts.Length > 1 ? queryParts[1].Trim() : "";
var results = gameObjects.AsQueryable();
switch (queryType)
{
case "name":
var pattern = WildcardToRegex(queryValue);
results = results.Where(go => Regex.IsMatch(go.name, pattern, RegexOptions.IgnoreCase));
break;
case "component":
var componentType = GetTypeByName(queryValue);
if (componentType != null)
{
results = results.Where(go => go.GetComponent(componentType));
}
else
{
// If the type can't be found, return no results.
results = Enumerable.Empty().AsQueryable();
}
break;
case "tag":
results = results.Where(go => go.CompareTag(queryValue));
break;
case "layer":
results = results.Where(go => go.layer == LayerMask.NameToLayer(queryValue));
break;
default:
return $"Error: Invalid query type '{queryType}'. Use 'name', 'component', or 'tag'.";
}
// Return a structured result with name and instance ID for each found object.
return results.Select(go => new SceneQueryResult { name = go.name, id = go.GetInstanceID().ToString() }).ToList();
}
private static System.Type GetTypeByName(string typeName)
{
foreach (var assembly in System.AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType(typeName);
if (type != null) return type;
}
return null;
}
private static string WildcardToRegex(string value)
{
return "^" + Regex.Escape(value).Replace("\\*", ".*").Replace("\\?", ".") + "$";
}
}
}