using System; using System.Threading.Tasks; using Serilog; using TINK.Model; using TINK.Model.Bikes.BikeInfoNS.BluetoothLock; using TINK.Model.Connector; using TINK.Model.Device; using TINK.Model.User; using TINK.MultilingualResources; using TINK.Services.BluetoothLock; using TINK.Services.Geolocation; using TINK.View; using static TINK.Model.Bikes.BikeInfoNS.BluetoothLock.Command.CloseCommand; using static TINK.ViewModel.Bikes.Bike.BluetoothLock.RequestHandlerFactory; namespace TINK.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler { public class BookedOpen : Base, IRequestHandler { /// View model to be used for progress report and unlocking/ locking view. public BookedOpen( IBikeInfoMutable selectedBike, Func isConnectedDelegate, Func connectorFactory, IGeolocationService geolocation, ILocksService lockService, Func viewUpdateManager, ISmartDevice smartDevice, IViewService viewService, IBikesViewModel bikesViewModel, IUser activeUser) : base( selectedBike, AppResources.ActionCloseLock, // Close Lock true, // Show button "Close Lock" isConnectedDelegate, connectorFactory, geolocation, lockService, viewUpdateManager, smartDevice, viewService, bikesViewModel, activeUser) { LockitButtonText = string.Empty; IsLockitButtonVisible = false; _closeLockActionViewModel = new CloseLockActionViewModel( selectedBike, viewUpdateManager, viewService, bikesViewModel); } /// /// Holds the view model for close action. /// private CloseLockActionViewModel _closeLockActionViewModel; /// Close lock (and return bike). public async Task HandleRequestOption1() { await _closeLockActionViewModel.CloseLockAsync(); if(_closeLockActionViewModel.IsEndRentalRequested == false) { return Create( SelectedBike, IsConnectedDelegate, ConnectorFactory, GeolocationService, LockService, ViewUpdateManager, SmartDevice, ViewService, BikesViewModel, ActiveUser); } var _endRentalActionViewModel = new EndRentalActionViewModel( SelectedBike, IsConnectedDelegate, ConnectorFactory, LockService, ViewUpdateManager, ViewService, BikesViewModel); await _endRentalActionViewModel.EndRentalAsync(); return Create( SelectedBike, IsConnectedDelegate, ConnectorFactory, GeolocationService, LockService, ViewUpdateManager, SmartDevice, ViewService, BikesViewModel, ActiveUser); } public Task HandleRequestOption2() => throw new InvalidOperationException(); /// Request 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); } /// /// Processes the close lock progress. /// /// /// Only used for testing. /// /// Current step to process. public void ReportStep(Step step) => _closeLockActionViewModel?.ReportStep(step); /// /// Processes the close lock state. /// /// /// Only used for testing. /// /// State to process. /// Textual details describing current state. public async Task ReportStateAsync(State state, string details) => await _closeLockActionViewModel.ReportStateAsync(state, details); } }