using GFramework.Core.Abstractions.model;
namespace GFramework.Game.Abstractions.setting;
///
/// 设置模型接口:
/// - 管理 Settings Data 的生命周期
/// - 管理并编排 Settings Applicator
/// - 管理 Settings Migration
///
public interface ISettingsModel : IModel
{
///
/// 获取一个布尔值,指示当前对象是否已初始化。
///
///
/// 如果对象已初始化,则返回 true;否则返回 false。
///
public bool IsInitialized { get; }
// =========================
// Data
// =========================
///
/// 获取指定类型的设置数据(唯一实例)
///
/// 设置数据类型,必须继承自ISettingsData并具有无参构造函数
/// 指定类型的设置数据实例
T GetData() where T : class, ISettingsData, new();
///
/// 获取所有已创建的设置数据
///
/// 所有已创建的设置数据集合
IEnumerable AllData();
// =========================
// Applicator
// =========================
///
/// 注册设置应用器
///
/// 设置数据类型,必须实现IResetApplyAbleSettings接口且具有无参构造函数
/// 要注册的设置应用器
/// 当前设置模型实例,支持链式调用
ISettingsModel RegisterApplicator(T applicator) where T : class, IResetApplyAbleSettings;
///
/// 获取指定类型的设置应用器
///
/// 要获取的设置应用器类型,必须继承自IResetApplyAbleSettings
/// 设置应用器实例,如果不存在则返回null
T? GetApplicator() where T : class, IResetApplyAbleSettings;
///
/// 获取所有设置应用器
///
/// 所有设置应用器的集合
IEnumerable AllApplicators();
// =========================
// Migration
// =========================
///
/// 注册设置迁移器
///
/// 要注册的设置迁移器
/// 当前设置模型实例,支持链式调用
ISettingsModel RegisterMigration(ISettingsMigration migration);
// =========================
// Lifecycle
// =========================
///
/// 初始化所有设置数据(加载 + 迁移)
///
/// 异步操作任务
Task InitializeAsync();
///
/// 保存所有设置数据
///
/// 异步操作任务
Task SaveAllAsync();
///
/// 应用所有设置
///
/// 异步操作任务
Task ApplyAllAsync();
///
/// 重置指定类型的设置
///
/// 要重置的设置类型,必须实现IResettable接口并具有无参构造函数
void Reset() where T : class, ISettingsData, new();
///
/// 重置所有设置数据与应用器
///
void ResetAll();
}