using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TINK.Model.Bikes.BikeInfoNS.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> Alarm types types. </summary>
	/// <remarks> Api-doc v29.0 </remarks>
	public enum AlarmSettings
	{
		SmallSensivity = 2,
		SmallSensivitySilent = 3,
		SmallSensitivityPrealarm = 22,
		MediumSensivity = 4,
		MediumSensivitySilent = 0x05,
		MediumSensivityPrealarm = 0x24,
		HightestSensivity = 0x10,
		HightestSensivitySilent = 0x11,
		HightestSensivityPrealarm = 0x30,
	}

	/// <summary> Sound types. </summary>
	/// <remarks> Api-doc v29.0 </remarks>
	public enum SoundSettings
	{
		OnLockingStartedWarn = 0x00,
		Warn = 0x01,
		LockingStarted = 0x02,
		AllOff = 0x03, // Mute
		OpenedSuccessfully = 0x04,
		LockingStartedOpenedSuccessfully = 0x05,
		AllOn = 0x06, // All sounds on
		OpenedSuccessfullyWarn = 0x07,
	}
}