using System; using TINK.Services.Geolocation; namespace TINK.Model.Bikes.BikeInfoNS.BluetoothLock { public class LockInfoMutable : ILockInfoMutable { /// Lock info object. private LockInfo LockInfo { get; set; } /// /// Delegate to create time stamp. /// private Func _nowDelegate; /// Constructs a bluetooth lock info object. /// Id of lock must always been known when constructing an lock info object. /// Delegate to create time stamp if null DateTime.Now is used. public LockInfoMutable( int id, Guid guid, byte[] userKey, byte[] adminKey, byte[] seed, LockingState state, Func nowDelegate = null) { _nowDelegate = nowDelegate ?? (() => DateTime.Now); LockInfo = new LockInfo.Builder() { Id = id, Guid = guid, UserKey = userKey, AdminKey = adminKey, Seed = seed, State = state }.Build(); } public int Id => LockInfo.Id; /// Changes during runtime: Can be unknown when set from copri and chang to a valid value when set from lock. public Guid Guid { get => LockInfo.Guid; set => LockInfo = new LockInfo.Builder(LockInfo) { Guid = value }.Build(); } public byte[] Seed => LockInfo.Seed; public byte[] UserKey => LockInfo.UserKey; public byte[] AdminKey => LockInfo.AdminKey; /// /// Gets or sets the locking state. /// public LockingState State { get => LockInfo.State; set { if (LockInfo.State == value) { // State does not change, nothing to do. return; } Location = null; // Invalidate location. LastLockingStateChange = _nowDelegate(); // Get time stamp when state change happened. LockInfo = new LockInfo.Builder(LockInfo) { State = value }.Build(); } } /// Gets the time stamp of the last locking state change. public DateTime? LastLockingStateChange { get; private set; } /// /// Gets or sets the current location of the bike, null if location is unknown. /// public IGeolocation Location { get; set; } /// Holds the percentage of lock battery. public double BatteryPercentage { get; set; } = double.NaN; /// /// Gets the version info of the lock. /// public IVersionInfo VersionInfo { get; set; } = new VersionInfo.Builder().Build(); /// Loads lock info object from values. public void Load(int id, Guid guid, byte[] seed, byte[] userKey, byte[] adminKey) { LockInfo = new LockInfo.Builder(LockInfo) { Id = id, Guid = guid, Seed = seed, UserKey = userKey, AdminKey = adminKey }.Build(); } } }