using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace LLM.Editor.Analysis
{
///
/// Provides access to Unity's project-wide settings assets by reflecting on their C# types.
/// This returns the true, programmatic property names needed for modification.
///
public class ProjectSettingsProvider : IContextProvider
{
public object GetContext(Object target, string qualifier)
{
if (string.IsNullOrEmpty(qualifier))
{
return "Error: A settings asset name (qualifier) is required (e.g., 'QualitySettings', 'TimeManager', 'GraphicsSettings').";
}
var assetPath = $"ProjectSettings/{qualifier}.asset";
var settingsObjects = AssetDatabase.LoadAllAssetsAtPath(assetPath);
if (settingsObjects == null || settingsObjects.Length == 0)
{
return $"Error: Could not find project settings file at '{assetPath}'. Please ensure the qualifier is a valid settings asset name.";
}
// Find the main settings object, which often matches the file name.
var mainSettingsObject = settingsObjects.FirstOrDefault(o => o != null && o.GetType().Name == qualifier)
?? settingsObjects.FirstOrDefault();
if (mainSettingsObject == null)
{
return $"Error: No valid settings object found in '{assetPath}'.";
}
var settingsType = mainSettingsObject.GetType();
var properties = settingsType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
var settingsData = new Dictionary();
foreach (var prop in properties)
{
// Ensure the property can be read and is not an indexer property.
if (!prop.CanRead || prop.GetIndexParameters().Length > 0) continue;
try
{
settingsData[prop.Name] = prop.GetValue(mainSettingsObject);
}
catch
{
// Ignore properties that throw exceptions when read.
}
}
return settingsData;
}
}
}