using System;
using TINK.Model.Connector;
using TINK.Model.Device;
using TINK.Model.User;
using TINK.View;
using TINK.ViewModel.Bikes.Bike.BC.RequestHandler;
using BikeInfoMutable = TINK.Model.Bike.BC.BikeInfoMutable;

namespace TINK.ViewModel.Bikes.Bike.BC
{
    public static class RequestHandlerFactory
    {
        /// <param name="smartDevice">Provides info about the smart device (phone, tablet, ...)</param>
        /// <param name="bikesViewModel">View model to be used for progress report and unlocking/ locking view.</param>
        public static IRequestHandler Create(
            BikeInfoMutable selectedBike,
            Func<bool> isConnectedDelegate,
            Func<bool, IConnector> connectorFactory,
            Func<IPollingUpdateTaskManager> viewUpdateManager,
            ISmartDevice smartDevice,
            IViewService viewService,
            IBikesViewModel bikesViewModel,
            IUser activeUser)
        {
            switch (selectedBike.State.Value)
            {
                case Model.State.InUseStateEnum.Disposable:
                    // Bike can be booked.
                    return new Disposable(
                        selectedBike,
                        isConnectedDelegate,
                        connectorFactory,
                        viewUpdateManager,
                        smartDevice,
                        viewService,
                        bikesViewModel,
                        activeUser);

                case Model.State.InUseStateEnum.Reserved:
                    // Reservation can be cancelled.
                    return new Reserved(
                        selectedBike,
                        isConnectedDelegate,
                        connectorFactory,
                        viewUpdateManager,
                        smartDevice,
                        viewService,
                        bikesViewModel,
                        activeUser);

                default:
                    // No action using app possible.
                    return new Booked(
                        selectedBike,
                        viewService,
                        bikesViewModel,
                        activeUser);
            }
        }
    }
}