    using LightlessSync.API.Data;

    namespace LightlessSync.PlayerData.Pairs;

    /// <summary>
    ///     orchestrates the lifecycle of a paired character
    /// </summary>
    public interface IPairHandlerAdapter : IDisposable, IPairPerformanceSubject
    {
        new string Ident { get; }
        bool Initialized { get; }
        bool IsVisible { get; }
        bool ScheduledForDeletion { get; set; }
        CharacterData? LastReceivedCharacterData { get; }
        long LastAppliedDataBytes { get; }
        new string? PlayerName { get; }
        string PlayerNameHash { get; }
        uint PlayerCharacterId { get; }
        DateTime? LastDataReceivedAt { get; }
        DateTime? LastApplyAttemptAt { get; }
        DateTime? LastSuccessfulApplyAt { get; }
        string? LastFailureReason { get; }
        IReadOnlyList<string> LastBlockingConditions { get; }
        bool IsApplying { get; }
        bool IsDownloading { get; }
        int PendingDownloadCount { get; }
        int ForbiddenDownloadCount { get; }
        bool PendingModReapply { get; }
        bool ModApplyDeferred { get; }
        int MissingCriticalMods { get; }
        int MissingNonCriticalMods { get; }
        int MissingForbiddenMods { get; }
        DateTime? InvisibleSinceUtc { get; }
        DateTime? VisibilityEvictionDueAtUtc { get; }

    void Initialize();
        void ApplyData(CharacterData data);
        void ApplyLastReceivedData(bool forced = false);
        bool FetchPerformanceMetricsFromCache();
        void LoadCachedCharacterData(CharacterData data);
        void SetUploading(bool uploading);
        void SetPaused(bool paused);
    }
