using Serilog; using System; using System.Threading.Tasks; using TINK.Model.Bike.CopriLock; using TINK.Model.Bikes.Bike.CopriLock; using TINK.Model.Connector; using TINK.Services.Geolocation; using TINK.Model.State; using TINK.MultilingualResources; using TINK.View; using TINK.Model.User; using TINK.Model.Device; using System.Linq; namespace TINK.ViewModel.Bikes.Bike.CopriLock.RequestHandler { using IRequestHandler = BluetoothLock.IRequestHandler; public class BookedDefault : Base, IRequestHandler { /// Provides info about the smart device (phone, tablet, ...) /// View model to be used for progress report and unlocking/ locking view. public BookedDefault( IBikeInfoMutable selectedBike, Func isConnectedDelegate, Func connectorFactory, IGeolocation geolocation, Func viewUpdateManager, ISmartDevice smartDevice, IViewService viewService, IBikesViewModel bikesViewModel, IUser activeUser) : base( selectedBike, nameof(BookedDefault), false, isConnectedDelegate, connectorFactory, geolocation, viewUpdateManager, smartDevice, viewService, bikesViewModel, activeUser) { LockitButtonText = AppResources.ActionSearchLock; IsLockitButtonVisible = true; } /// Gets the bike state. public override InUseStateEnum State => InUseStateEnum.Booked; public async Task HandleRequestOption1() => await UnsupportedRequest(); /// Scan for lock. /// public async Task HandleRequestOption2() => await ConnectLock(); /// Requst is not supported, button should be disabled. /// public async Task UnsupportedRequest() { Log.ForContext().Error("Click of unsupported button click detected."); return await Task.FromResult(this); } /// Scan for lock. /// public async Task ConnectLock() { // Lock list to avoid multiple taps while copri action is pending. BikesViewModel.IsIdle = false; Log.ForContext().Information("Request to search {bike} detected.", SelectedBike); // Stop polling before getting new auth-values. BikesViewModel.ActionText = AppResources.ActivityTextOneMomentPlease; await ViewUpdateManager().StopUpdatePeridically(); var bikesInfo = (await ConnectorFactory(IsConnected).Query.GetBikesOccupiedAsync())?.Response?.Where(bike => bike.Id == SelectedBike.Id).ToArray(); var bikeInfo = bikesInfo.Length > 0 ? bikesInfo[0] as BikeInfo : null; SelectedBike.LockInfo.State = bikeInfo != null ? bikeInfo.LockInfo.State: SelectedBike.LockInfo.State; Log.ForContext().Information($"State for bike {SelectedBike.Id} updated successfully. Value is {SelectedBike.LockInfo.State}."); // Restart polling again. BikesViewModel.ActionText = AppResources.ActivityTextStartingUpdater; await ViewUpdateManager().StartUpdateAyncPeridically(); BikesViewModel.ActionText = string.Empty; BikesViewModel.IsIdle = true; return RequestHandlerFactory.Create(SelectedBike, IsConnectedDelegate, ConnectorFactory, Geolocation, ViewUpdateManager, SmartDevice, ViewService, BikesViewModel, ActiveUser); } } }