using PSLauncher.Models;

namespace PSLauncher.Core.Manifests;

/// <summary>D'où provient le dernier manifest récupéré avec succès.</summary>
public enum ManifestSource
{
    /// <summary>Pas encore récupéré dans cette session.</summary>
    None,
    /// <summary>Source canonique : serveur OVH via Internet.</summary>
    Ovh,
    /// <summary>Peer LAN (offline ou OVH down). Manifest peut être plus ancien que celui d'OVH.</summary>
    Peer,
    /// <summary>Cache disque local (offline + aucun peer atteignable). Manifest figé à la dernière fetch.</summary>
    DiskCache,
}

public interface IManifestService
{
    Task<RemoteManifest> FetchAsync(CancellationToken ct);
    Task<string> FetchReleaseNotesAsync(string url, CancellationToken ct);

    /// <summary>Source du dernier <see cref="FetchAsync"/> réussi. Sert au call site
    /// pour décider de skip les fetch dépendants d'OVH (release notes, signed URL)
    /// quand on sait qu'on est offline.</summary>
    ManifestSource LastSource { get; }
}
