using Plugin.BLE.Abstractions.Contracts;
using System;
using System.Threading.Tasks;

namespace TINK.Services.BluetoothLock
{
    public static class StateChecker
    {
        /// <summary>
        /// Get current bluetooth state
        /// </summary>
        /// <remarks>See https://github.com/xabre/xamarin-bluetooth-le/issues/112#issuecomment-380994887.</remarks>
        /// <param name="ble">Crossplatform bluetooth implementation object</param>
        /// <returns>BluetoothState</returns>
        public static Task<BluetoothState> GetBluetoothState(this IBluetoothLE ble)
        {
            var tcs = new TaskCompletionSource<BluetoothState>();

            if (ble.State != BluetoothState.Unknown)
            {
                // If we can detect state out of box just returning in
                tcs.SetResult(ble.State);
            }
            else
            {
                // Otherwise let's setup dynamic event handler and wait for first state update
                EventHandler<Plugin.BLE.Abstractions.EventArgs.BluetoothStateChangedArgs> handler = null;
                handler = (o, e) =>
                {
                    ble.StateChanged -= handler;
                    // and return it as our state
                    // we can have an 'Unknown' check here, but in normal situation it should never occur
                    tcs.SetResult(e.NewState);
                };
                ble.StateChanged += handler;
            }

            return tcs.Task;
        }
    }
}