namespace PSLauncher.Core.Lan;

/// <summary>
/// Un peer découvert via le broadcast UDP. <see cref="LastSeenUtc"/> sert au TTL :
/// si le peer ne renvoie plus de beacon pendant > 60 s, il est considéré offline
/// et n'apparaît plus dans <see cref="ILanDiscoveryService.ListDiscovered"/>.
/// </summary>
public sealed record DiscoveredPeer(
    string Host,
    int Port,
    IReadOnlyList<string> Versions,
    DateTime LastSeenUtc);

/// <summary>
/// Auto-découverte des peers PSLauncher du LAN via UDP broadcast.
///
/// Mode serveur (ServerEnabled=true) : émet un beacon JSON sur 255.255.255.255:DiscoveryPort
/// toutes les 15 s avec son host/port HTTP + la liste des versions cachées.
///
/// Mode client (ClientEnabled=true OU ServerEnabled=true) : écoute sur le port,
/// parse les beacons, maintient un dictionnaire interne avec TTL.
///
/// Note : le mode serveur écoute aussi (pour ne pas avoir à demander à l'OS deux
/// fois le port via SO_REUSEADDR), mais il ignore ses propres beacons.
/// </summary>
public interface ILanDiscoveryService
{
    /// <summary>Liste des peers vus récemment (lastSeen >= now - 60s). Vide si discovery désactivée.</summary>
    IReadOnlyList<DiscoveredPeer> ListDiscovered();

    /// <summary>
    /// Peers connus de runs précédents, chargés depuis le cache disque au démarrage
    /// (max 1 semaine). Utile en cold start pour éviter d'attendre les 15 s du
    /// premier beacon UDP avant qu'un peer apparaisse.
    /// </summary>
    IReadOnlyList<DiscoveredPeer> ListKnown();
}
