// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using GFramework.Core.Abstractions.Utility;
namespace GFramework.Core.Abstractions.Resource;
///
/// 资源管理器接口,提供资源加载、缓存和卸载功能
/// 线程安全:所有方法都是线程安全的
///
public interface IResourceManager : IUtility
{
///
/// 获取已加载资源的数量
///
int LoadedResourceCount { get; }
///
/// 同步加载资源
///
/// 资源类型
/// 资源路径
/// 资源实例,如果加载失败返回 null
T? Load(string path) where T : class;
///
/// 异步加载指定路径的资源,并在缓存中对并发加载进行去重。
///
/// 资源类型
/// 资源路径,不能为空或空白。
/// 加载成功返回资源实例;加载失败返回 。
/// 当 为空或空白时抛出。
/// 当未注册对应资源加载器时抛出。
/// 实现内部可能使用 ConfigureAwait(false),异步延续不保证回到调用线程。
Task LoadAsync(string path) where T : class;
///
/// 获取资源句柄(增加引用计数)
///
/// 资源类型
/// 资源路径
/// 资源句柄
IResourceHandle? GetHandle(string path) where T : class;
///
/// 卸载指定路径的资源
///
/// 资源路径
/// 如果成功卸载返回 true,否则返回 false
bool Unload(string path);
///
/// 卸载所有资源
///
void UnloadAll();
///
/// 检查资源是否已加载
///
/// 资源路径
/// 如果已加载返回 true,否则返回 false
bool IsLoaded(string path);
///
/// 注册资源加载器
///
/// 资源类型
/// 资源加载器
void RegisterLoader(IResourceLoader loader) where T : class;
///
/// 取消注册资源加载器
///
/// 资源类型
void UnregisterLoader() where T : class;
///
/// 预加载资源到缓存中。
///
/// 资源类型
/// 资源路径,不能为空或空白。
/// 表示预加载流程完成的任务。
/// 当 为空或空白时抛出。
/// 当未注册对应资源加载器时抛出。
/// 内部委托给 ,同样不捕获同步上下文。
Task PreloadAsync(string path) where T : class;
///
/// 获取所有已加载资源的路径
///
IEnumerable GetLoadedResourcePaths();
///
/// 设置资源释放策略
///
/// 资源释放策略
void SetReleaseStrategy(IResourceReleaseStrategy strategy);
}