using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TINK.Model.Bike.BluetoothLock;
using TINK.Services.BluetoothLock.Tdo;

namespace TINK.Services.BluetoothLock
{
    public interface ILocksService
    {
        /// <summary> Holds timeout values for series of connecting attemps to a lock or multiple locks. </summary>
        ITimeOutProvider TimeOut { get; set; }

        /// <summary> Gets lock info for all lock in reach./// </summary>
            /// <param name="connectTimeout">Timeout for connect operation of a single lock.</param>
        Task<IEnumerable<LockInfoTdo>> GetLocksStateAsync(
            IEnumerable<LockInfoAuthTdo> locksInfo, 
            TimeSpan connectTimeout);

        /// <summary> Connects to lock.</summary>
        /// <param name="authInfo"> Info required to connect to lock.</param>
        /// <param name="connectTimeout">Timeout for connect operation.</param>
        Task<LockInfoTdo> ConnectAsync(
            LockInfoAuthTdo authInfo, 
            TimeSpan connectTimeout);

        /// <summary>Gets a lock by bike Id.</summary>
        /// <param name="bikeId"></param>
        /// <returns>Lock object</returns>
        ILockService  this[int bikeId] { get; }

        /// <summary> Disconnects lock.</summary>
        /// <param name="bikeId"> Id of lock to disconnect.</param>
        /// <param name="bikeGuid"> Guid of lock to disconnect.</param>
        /// <returns> State disconnected it lock is already disconneced or after successfully disconnecting.</returns>
        Task<LockingState> DisconnectAsync(int bikeId, Guid bikeGuid);
    }

    /// <summary> Sound types. </summary>
    /// <remarks>
    /// 1. Locking process started: One long beep.
    /// 2. Unlocking successful: One short beep.
    /// 3. Bike moved while trying to lock: Three short beeps.
    /// 4. Locking bolt blocked while locking: Three short beeps.
    /// 5. Unable to unlock because locking bolt is blocked: Three short beeps.
    /// </remarks>
    public enum SoundSettings
    {
        AllButOpenedSuccessfully, // Sounds: 1, 3, 4, 5
        MovingBlocked = 1, // Sounds: 3, 4, 5
        LockingStarted = 2, // Sounds: 1
        AllOff = 3, // Mute
        OpenedSuccessfully = 4, // Sounds: 2
        LockingStartedOpenedSuccessfully = 5, // Sounds: 1, 2
        AllOn = 6, // All sounds on
        AllButLockingStarted = 7, // Sounds: 2, 3, 4, 5
    }
}