using System; using System.Threading.Tasks; using ShareeBike.Model.Connector; using ShareeBike.Model.Device; using ShareeBike.Model.User; using ShareeBike.MultilingualResources; using ShareeBike.Services.BluetoothLock; using ShareeBike.Services.Geolocation; using ShareeBike.View; using IBikeInfoMutable = ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.IBikeInfoMutable; using CancelReservationCommand = ShareeBike.Model.Bikes.BikeInfoNS.BikeNS.Command.CancelReservationCommand; using StartRentalCommand = ShareeBike.Model.Bikes.BikeInfoNS.BikeNS.Command.StartRentalCommand; using static ShareeBike.ViewModel.Bikes.Bike.BluetoothLock.RequestHandlerFactory; namespace ShareeBike.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler { /// Bike is reserved, lock is closed and connected to app. /// /// Occurs when /// - bike was reserved out of reach and is in reach now /// - bike is reserved while in reach /// public class ReservedClosed : Base, IRequestHandler, CancelReservationCommand.ICancelReservationCommandListener, StartRentalCommand.IStartRentalCommandListener { /// Provides info about the smart device (phone, tablet, ...) /// View model to be used for progress report and unlocking/ locking view. public ReservedClosed( IBikeInfoMutable selectedBike, Func isConnectedDelegate, Func connectorFactory, IGeolocationService geolocation, ILocksService lockService, Func viewUpdateManager, ISmartDevice smartDevice, IViewService viewService, IBikesViewModel bikesViewModel, IUser activeUser) : base( selectedBike, AppResources.ActionCancelReservation, // Cancel Reservation true, // Show button isConnectedDelegate, connectorFactory, geolocation, lockService, viewUpdateManager, smartDevice, viewService, bikesViewModel, activeUser) { LockitButtonText = AppResources.ActionOpenLockAndRentBike; // Rent Bike IsLockitButtonVisible = true; // Show button _cancelReservationActionViewModel = new CancelReservationActionViewModel( selectedBike, viewUpdateManager, viewService, bikesViewModel); _startRentalActionViewModel = new StartReservationOrRentalActionViewModel( selectedBike, viewUpdateManager, viewService, bikesViewModel); } /// /// Holds the view model for requesting a bike action. /// private readonly CancelReservationActionViewModel _cancelReservationActionViewModel; /// /// Processes the canceling of reservation progress. /// /// /// Only used for testing. /// /// Current step to process. public void ReportStep(CancelReservationCommand.Step step) => _cancelReservationActionViewModel?.ReportStep(step); /// /// Processes the canceling of reservation state. /// /// /// Only used for testing. /// /// State to process. /// Textual details describing current state. public async Task ReportStateAsync(CancelReservationCommand.State state, string details) => await _cancelReservationActionViewModel.ReportStateAsync(state, details); /// /// Holds the view model for requesting a bike action. /// private readonly StartReservationOrRentalActionViewModel _startRentalActionViewModel; /// /// Processes the renting a bike progress. /// /// /// Only used for testing. /// /// Current step to process. public void ReportStep(StartRentalCommand.Step step) => _startRentalActionViewModel?.ReportStep(step); /// /// Processes the renting a bike state. /// /// /// Only used for testing. /// /// State to process. /// Textual details describing current state. public async Task ReportStateAsync(StartRentalCommand.State state, string details) => await _startRentalActionViewModel.ReportStateAsync(state, details); /// Cancel reservation. public async Task HandleRequestOption1() { await _cancelReservationActionViewModel.CancelReservationAsync(); return Create( SelectedBike, IsConnectedDelegate, ConnectorFactory, GeolocationService, LockService, ViewUpdateManager, SmartDevice, ViewService, BikesViewModel, ActiveUser); } /// Open lock and rent bike. public async Task HandleRequestOption2() { await _startRentalActionViewModel.StartReservationOrRentalAsync(); if (_startRentalActionViewModel.ContinueWithOpenLock == false) { return Create( SelectedBike, IsConnectedDelegate, ConnectorFactory, GeolocationService, LockService, ViewUpdateManager, SmartDevice, ViewService, BikesViewModel, ActiveUser); } var _openLockActionViewModel = new OpenLockActionViewModel( SelectedBike, ViewUpdateManager, ViewService, BikesViewModel); await _openLockActionViewModel.OpenLockAsync(); return Create( SelectedBike, IsConnectedDelegate, ConnectorFactory, GeolocationService, LockService, ViewUpdateManager, SmartDevice, ViewService, BikesViewModel, ActiveUser); } } }