using System; using System.Collections.Generic; using TINK.Model.Bikes.Bike; using TINK.Model.State; namespace TINK.Model.Bike.BC { public class BikeInfo : IBikeInfo { /// Default value of demo property. public const bool DEFAULTVALUEISDEMO = false; /// Holds the info about the bike state. private readonly IStateInfo m_oStateInfo; /// /// Holds the bike object. /// private Bike Bike { get; } /// Constructs a bike object. protected BikeInfo( IStateInfo stateInfo, string id, LockModel lockModel, bool? isDemo = DEFAULTVALUEISDEMO, IEnumerable group = null, WheelType? wheelType = null, TypeOfBike? typeOfBike = null, string description = null, string stationId = null, Uri operatorUri = null, RentalDescription tariffDescription = null) { Bike = new Bike(id, lockModel, wheelType, typeOfBike, description); m_oStateInfo = stateInfo; IsDemo = isDemo ?? DEFAULTVALUEISDEMO; Group = group ?? new List(); StationId = stationId; OperatorUri = operatorUri; TariffDescription = tariffDescription; } public BikeInfo(BikeInfo bikeInfo) : this( bikeInfo?.State, bikeInfo?.Id ?? throw new ArgumentException($"Can not copy-construct {typeof(BikeInfo).Name}-object. Source must not be null."), bikeInfo.LockModel, bikeInfo.IsDemo, bikeInfo.Group, bikeInfo.WheelType, bikeInfo.TypeOfBike, bikeInfo.Description, bikeInfo.StationId, bikeInfo.OperatorUri, bikeInfo.TariffDescription) { } /// /// Constructs a bike info object for a available bike. /// /// Unique id of bike. /// Id of station where bike is located. /// Holds the uri of the operator or null, in case of single operator setup. /// Hold tariff description of bike. /// public BikeInfo( string id, LockModel lockModel, string stationId, Uri operatorUri = null, RentalDescription tariffDescription = null, bool? isDemo = DEFAULTVALUEISDEMO, IEnumerable group = null, WheelType? wheelType = null, TypeOfBike? typeOfBike = null, string description = null) : this( new StateInfo(), id, lockModel, isDemo, group, wheelType, typeOfBike, description, stationId, operatorUri, tariffDescription) { } /// /// Constructs a bike info object for a requested bike. /// /// /// Unique id of bike. /// Name of station where bike is located, null if bike is on the road. /// Holds the uri of the operator or null, in case of single operator setup. /// Hold tariff description of bike. /// Date time when bike was requested /// Mail address of user which requested bike. /// Booking code. /// Date time provider to calculate reaining time. public BikeInfo( string id, LockModel lockModel, bool? isDemo, IEnumerable group, WheelType? wheelType, TypeOfBike? typeOfBike, string description, string stationId, Uri operatorUri, RentalDescription tariffDescription, DateTime requestedAt, string mailAddress, string code, Func dateTimeProvider = null) : this( new StateInfo( dateTimeProvider, requestedAt, mailAddress, code), id, lockModel, isDemo, group, wheelType, typeOfBike, description, stationId, operatorUri, tariffDescription) { } /// /// Constructs a bike info object for a booked bike. /// /// Provider for current date time to calculate remainig time on demand for state of type reserved. /// /// Specifies the lock model. /// Unique id of bike. /// Name of station where bike is located, null if bike is on the road. /// Holds the uri of the operator or null, in case of single operator setup. /// Hold tariff description of bike. /// Date time when bike was booked /// Mail address of user which booked bike. /// Booking code. public BikeInfo( string id, LockModel lockModel, bool? isDemo, IEnumerable group, WheelType? wheelType, TypeOfBike? typeOfBike, string description, string currentStationId, Uri operatorUri, RentalDescription tariffDescription, DateTime bookedAt, string mailAddress, string code) : this( new StateInfo( bookedAt, mailAddress, code), id, lockModel, isDemo, group, wheelType, typeOfBike, description, currentStationId, operatorUri, tariffDescription) { } /// True if device is demo device, false otherwise. public bool IsDemo { get; } /// Returns the group (TINK, Konrad, ...). public IEnumerable Group { get; } /// /// Station a which bike is located, null otherwise. /// public string StationId { get; } /// Holds description about the tarif. public RentalDescription TariffDescription { get; } /// Holds the rent state of the bike. /// public IStateInfo State { get { return m_oStateInfo; } } public string Id => Bike.Id; public WheelType? WheelType => Bike.WheelType; public TypeOfBike? TypeOfBike => Bike.TypeOfBike; /// Gets the model of the lock. public LockModel LockModel => Bike.LockModel; public string Description => Bike.Description; /// /// Uri of the operator or null, in case of single operator setup. /// public Uri OperatorUri { get; } /// /// Converts the instance to text. /// public new string ToString() { return $"Id={Bike.Id}{(Bike.WheelType != null ? $", wheel(s)={Bike.WheelType}" : string.Empty)}{(Bike.TypeOfBike != null ? $"type={Bike.TypeOfBike}" : "")}, state={State}, location={(!string.IsNullOrEmpty(StationId)? $"Station {StationId}" : "On the road")}, is demo={IsDemo}."; } } }