namespace PSLauncher.Core.Health.OpenVRInterop;

/// <summary>
/// Lecture en arrière-plan (sans démarrer SteamVR ni prendre le compositor)
/// de l'état des devices SteamVR : HMD, controllers, trackers, base stations.
/// Implémentation : <see cref="OpenVrService"/>.
/// </summary>
public interface IOpenVrService
{
    /// <summary>
    /// Interroge un device par alias :
    /// <c>hmd</c>, <c>left_controller</c>, <c>right_controller</c>,
    /// <c>tracker_1..N</c>, <c>base_station_1..N</c>.
    /// </summary>
    VrDeviceQueryResult Query(string deviceAlias);
}

/// <summary>
/// État de disponibilité de la runtime OpenVR. <c>RuntimeMissing</c> = openvr_api.dll
/// introuvable (SteamVR pas installé). <c>HmdAbsent</c> = SteamVR installé mais
/// vrserver pas lancé ou aucun HMD branché. <c>InitFailed</c> = API trouvée mais
/// VR_InitInternal2 a échoué (cas rare : permission denied, version mismatch).
/// <c>Ready</c> = OK, on peut lire les properties.
/// </summary>
public enum VrRuntimeState
{
    Unknown,
    RuntimeMissing,
    HmdAbsent,
    InitFailed,
    Ready,
}

/// <summary>
/// Résultat d'une requête sur un device. <see cref="Found"/> est false quand
/// l'alias résolu ne correspond à aucun device connecté (ex. tracker_3 absent).
/// </summary>
public sealed record VrDeviceQueryResult(
    VrRuntimeState RuntimeState,
    bool Found,
    string DeviceLabel,         // ex. "HMD", "Manette gauche"
    string? Serial,              // serial number ou null
    OpenVRNative.ETrackedDeviceClass DeviceClass,
    bool? IsConnected,
    bool? IsCharging,
    bool? IsWireless,
    float? BatteryPercentage,    // 0.0–1.0, null si propriété non exposée par le device
    OpenVRNative.EDeviceActivityLevel? ActivityLevel,
    string? ErrorDetail);
