using PSLauncher.Models;

namespace PSLauncher.Core.Manifests;

/// <summary>
/// Cache disque du dernier manifest récupéré avec succès. Sert deux usages :
/// 1. Permet au <c>LanCacheServer</c> de servir le manifest aux peers du LAN
///    (route <c>GET /v1/manifest</c>).
/// 2. Permet au launcher de fallback sur ce cache si OVH est injoignable et
///    qu'aucun peer LAN ne répond non plus (mode offline complet).
///
/// Stocke le JSON brut (pas un objet désérialisé) pour préserver la signature
/// Ed25519 byte-for-byte — la canonicalisation côté validation exige les bytes
/// originaux. Path : <c>%LocalAppData%\PSLauncher\manifest-cache.json</c>.
/// </summary>
public interface IManifestCache
{
    /// <summary>Persiste le JSON brut sur disque (atomic via .tmp + Move).</summary>
    Task SaveAsync(string rawJson, CancellationToken ct);

    /// <summary>Chemin du fichier cache (utilisé par LanCacheServer pour servir /v1/manifest).</summary>
    string GetCachedFilePath();

    /// <summary>Lit + désérialise le manifest cached. Null si pas de cache.</summary>
    Task<RemoteManifest?> TryLoadAsync(CancellationToken ct);
}
