using System.Linq;
using UnityEditor;
using System.Collections.Generic;
using IntelligentProjectAnalyzer.Editor.Graphing;
using IntelligentProjectAnalyzer.Editor.DependencyViewer;
using Object = UnityEngine.Object;
namespace LLM.Editor.Analysis
{
///
/// Provides dependency information for a given asset by querying the cached DependencyGraph.
///
public class DependencyGraphProvider : IContextProvider
{
public object GetContext(Object target, string qualifier)
{
if (!target)
{
return "Error: A valid target asset is required to get dependencies.";
}
var path = AssetDatabase.GetAssetPath(target);
var guid = AssetDatabase.AssetPathToGUID(path);
if (string.IsNullOrEmpty(guid))
{
return $"Error: Could not get GUID for asset '{target.name}'.";
}
var dependencyGraph = new DependencyGraph();
if (!dependencyGraph.AssetExists(guid))
{
return $"Error: Asset '{target.name}' not found in the dependency graph. The cache might be out of date.";
}
// The qualifier determines if we get all recursive dependencies or only direct ones.
var recursive = qualifier?.ToLower() == "recursive";
var dependencyGuids = new HashSet();
if (recursive)
{
GetAllDependencies(guid, dependencyGraph, dependencyGuids);
}
else
{
dependencyGuids = new HashSet(dependencyGraph.GetDependencies(guid));
}
// Convert the final list of GUIDs into structured, readable nodes.
return dependencyGuids.Select(AssetNodeResolver.CreateNodeFromGuid).ToList();
}
///
/// Recursively traverses the dependency graph to collect all unique dependencies.
///
private static void GetAllDependencies(string currentGuid, DependencyGraph graph, HashSet collectedGuids)
{
var directDependencies = graph.GetDependencies(currentGuid);
foreach (var depGuid in directDependencies.Where(collectedGuids.Add))
{
GetAllDependencies(depGuid, graph, collectedGuids);
}
}
}
}