namespace SHH.CameraSdk;

/// <summary>
/// 元数据变更差异描述符（只读结构体）
/// 核心职责：对比设备当前运行元数据与最新拉取元数据的差异，明确变更类型及业务影响
/// 协作场景：指导上层模块执行差异化处理（如仅刷新UI、重启流、调整功能按钮）
/// </summary>
public readonly struct MetadataDiff
{
    #region --- 差异类型属性 (Change Type Properties) ---

    /// <summary>
    /// 设备基础描述信息变更（如名称、位置）
    /// 业务影响：仅需刷新 UI 显示文字，无需中断当前流
    /// </summary>
    public bool NameChanged { get; init; }

    /// <summary>
    /// 设备能力集变更（如新增/移除对讲、截图功能）
    /// 业务影响：需调整 UI 功能按钮的可用性，无需中断流
    /// </summary>
    public bool CapabilityChanged { get; init; }

    /// <summary>
    /// 致命/破坏性变更（如设备型号、编码格式变更）
    /// 业务影响：必须销毁当前流实例并重启，否则会导致流异常或崩溃
    /// </summary>
    public bool IsMajorChange { get; init; }

    /// <summary>
    /// 分辨率/帧率档位列表变更
    /// 业务影响：需重新校验当前流参数是否合法，非法则自动降级到可用档位
    /// </summary>
    public bool ResolutionProfilesChanged { get; init; }

    /// <summary>
    /// 全局变更标识：是否存在任何类型的元数据变更
    /// 业务用途：快速判断是否需要执行后续差异化处理逻辑
    /// </summary>
    public bool HasChanges => NameChanged || CapabilityChanged || IsMajorChange || ResolutionProfilesChanged;

    #endregion

    #region --- 快捷实例 (Quick Instances) ---

    /// <summary>
    /// 无变更状态的快捷实例
    /// 业务用途：元数据刷新后无变化时直接返回，避免重复创建空对象
    /// </summary>
    public static MetadataDiff None => new();

    #endregion
}