using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using UnityEngine;
namespace AibisDream.SaveSystem.CloudSave
{
///
/// 云存档协调器:负责选择当前平台的 backend,并在槽位写入/读取后触发同步钩子。
///
/// P2 不实现真实云同步逻辑,仅保留扩展点。
///
///
public static class CloudSaveManager
{
private static readonly List Backends = new();
/// 注册一个云存档后端。应在游戏启动时调用一次。
public static void RegisterBackend(ICloudSaveBackend backend)
{
if (backend == null)
{
return;
}
Backends.Add(backend);
}
/// 清空已注册后端(主要用于测试)。
public static void ClearBackends()
{
Backends.Clear();
}
/// 槽位写入后调用:触发所有可用后端的异步上传。
public static void OnSlotWritten(int slotIndex)
{
_ = UploadSlotAsync(slotIndex);
}
/// 槽位读取前调用:可触发下载(P2 默认不自动下载,避免覆盖本地进度)。
public static void OnSlotRestored(int slotIndex)
{
// P2 占位:未来可在此触发冲突检测与下载。
}
/// 手动触发指定槽位的云同步上传。
public static async Task UploadSlotAsync(int slotIndex)
{
var filePaths = CollectSlotFilePaths(slotIndex);
if (filePaths.Count == 0)
{
return;
}
foreach (var backend in Backends)
{
if (!backend.IsAvailable)
{
continue;
}
try
{
await backend.UploadSlotAsync(slotIndex, filePaths.ToArray());
Debug.Log($"[CloudSaveManager] {backend.PlatformName} 上传槽位 {slotIndex} 完成。");
}
catch (Exception ex)
{
Debug.LogWarning($"[CloudSaveManager] {backend.PlatformName} 上传槽位 {slotIndex} 失败: {ex.Message}");
}
}
}
/// 收集槽位下需要同步的文件路径。
private static List CollectSlotFilePaths(int slotIndex)
{
var paths = new List();
var snapshotPath = SlotDirectory.GetSnapshotPath(slotIndex);
if (File.Exists(snapshotPath))
{
paths.Add(snapshotPath);
}
var metaPath = SlotDirectory.GetMetaPath(slotIndex);
if (File.Exists(metaPath))
{
paths.Add(metaPath);
}
var thumbnailPath = SlotDirectory.GetThumbnailPath(slotIndex);
if (File.Exists(thumbnailPath))
{
paths.Add(thumbnailPath);
}
return paths;
}
}
}