using System;
using System.Threading.Tasks;
using TINK.Services.BluetoothLock.Tdo;

namespace TINK.Services.BluetoothLock
{
    public enum DeviceState
    {
        Disconnected = 0,
        Connecting = 1,
        Connected = 2,
        Limited = 3 /* Mactches Connecting? */
    }

    public interface ILockService
    {
        /// <summary> Reconnect to lock. </summary>
        Task ReconnectAsync(
            LockInfoAuthTdo authInfo,
            TimeSpan connectTimeout);
        
        /// <summary> Opens lock. </summary>
        /// <returns> State of lock after performing open operation. </returns>
        Task<LockitLockingState?> OpenAsync();

        /// <summary> Closes lock. </summary>
        /// <returns>State of lock after performing close operation.</returns>
        Task<LockitLockingState?> CloseAsync();

        string Name { get; }

        Guid Guid { get; }

        int Id { get; }

        /// <summary> Gets the device state.</summary>
        DeviceState? GetDeviceState();

        /// <summary>
        /// Gets the locking state.
        /// </summary>
        /// <param name="doWaitRetry">True if to wait and retry in case of failures. </param>
        /// <returns></returns>
        Task<LockInfoTdo> GetLockStateAsync(bool doWaitRetry = false);

        Task<bool> SetSoundAsync(SoundSettings settings);

        Task<bool> GetIsAlarmOffAsync();

        Task SetIsAlarmOffAsync(bool isActivated);

        /// <summary>Gets the battery percentage.</summary>
        Task<double> GetBatteryPercentageAsync();

        /// <summary> Disconnect from lock.</summary>
        Task Disconnect();
    }
}