using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.Serialization; using TINK.Model.Bikes.BikeInfoNS.BikeNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS; using TINK.Model.State; namespace TINK.Model.Bikes.BikeInfoNS.BC { [DataContract] public class BikeInfoMutable : IBikeInfoMutable, INotifyPropertyChanged { /// Holds the bike. private readonly BikeNS.Bike _Bike; /// Holds the drive of the bike. private readonly Drive _Drive; /// Holds the state info of the bike. private readonly StateInfoMutable _StateInfo; /// /// Constructs a bike. /// /// True if device is demo device, false otherwise. /// Provider for current date time to calculate remainig time on demand for state of type reserved. /// 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. /// Bike state info. protected BikeInfoMutable( BikeNS.Bike bike, Drive drive, bool isDemo = BikeInfo.DEFAULTVALUEISDEMO, IEnumerable group = null, string stationId = null, string stationName = null, Uri operatorUri = null, RentalDescription tariffDescription = null, Func dateTimeProvider = null, IStateInfo stateInfo = null) { IsDemo = isDemo; Group = group; _Bike = bike; _Drive = drive; _StateInfo = new StateInfoMutable(dateTimeProvider, stateInfo); _StateInfo.PropertyChanged += (sender, eventargs) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(eventargs.PropertyName)); StationId = stationId; StationName = stationName; OperatorUri = operatorUri; TariffDescription = tariffDescription; } /// Constructs a bike object from source. public BikeInfoMutable(IBikeInfo bike, string stationName) : this( bike != null ? bike.Bike : throw new ArgumentNullException(nameof(bike)), bike.Drive, bike.IsDemo, bike.Group, bike.StationId, stationName, bike.OperatorUri, bike.TariffDescription, null /* date time provider */, bike.State) { } /// Id of station a which bike is located, null otherwise. [DataMember] public string StationId { get; } /// Name of station a which bike is located, null otherwise. [DataMember] public string StationName { get; } /// Holds description about the tarif. [DataMember] public RentalDescription TariffDescription { get; private set; } /// /// Holds the rent state of the bike. /// [DataMember] public StateInfoMutable State { get { return _StateInfo; } } /// /// Uri of the operator or null, in case of single operator setup. /// public Uri OperatorUri { get; } /// Unused member. IStateInfoMutable IBikeInfoMutable.State => _StateInfo; public string Id => _Bike.Id; public bool IsDemo { get; } /// Returns the group (TINK, Konrad, ...). public IEnumerable Group { get; } public WheelType? WheelType => _Bike.WheelType; public TypeOfBike? TypeOfBike => _Bike.TypeOfBike; public LockModel LockModel => _Bike.LockModel; public string Description => _Bike.Description; public Drive Drive => _Drive; /// /// Fired whenever property of bike changes. /// public event PropertyChangedEventHandler PropertyChanged; /// /// Converts the instance to text. /// public new string ToString() { return $"Id={Id}{(WheelType != null ? $", wheel(s)={WheelType}" : string.Empty)}{(TypeOfBike != null ? $", type={TypeOfBike}" : "")}, demo={IsDemo}, state={State.ToString()}, location={(!string.IsNullOrEmpty(StationId) ? $"Station {StationId}" : "On the road")}."; } } }