// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

#nullable disable

using osu.Framework.Bindables;
using osu.Framework.Timing;

namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate
{
    /// <summary>
    /// A clock which is used by <see cref="MultiSpectatorPlayer"/>s and managed by an <see cref="ISyncManager"/>.
    /// </summary>
    public interface ISpectatorPlayerClock : IFrameBasedClock, IAdjustableClock
    {
        /// <summary>
        /// Starts this <see cref="ISpectatorPlayerClock"/>.
        /// </summary>
        new void Start();

        /// <summary>
        /// Stops this <see cref="ISpectatorPlayerClock"/>.
        /// </summary>
        new void Stop();

        /// <summary>
        /// Whether this clock is waiting on frames to continue playback.
        /// </summary>
        Bindable<bool> WaitingOnFrames { get; }

        /// <summary>
        /// Whether this clock is behind the master clock and running at a higher rate to catch up to it.
        /// </summary>
        /// <remarks>
        /// Of note, this will be false if this clock is *ahead* of the master clock.
        /// </remarks>
        bool IsCatchingUp { get; set; }

        /// <summary>
        /// The source clock
        /// </summary>
        IFrameBasedClock Source { set; }
    }
}