using System;
using TINK.Model.Bikes.Bike.BluetoothLock;

namespace TINK.Model.Bike.BluetoothLock
{
    public class LockInfoMutable : ILockInfoMutable
    {
        /// <summary> Lock info object. </summary>
        private LockInfo LockInfo { get; set; }

        /// <summary> Constructs a bluetooth lock info object. </summary>
        /// <param name="id">Id of lock must always been known when constructing an lock info object.</param>
        public LockInfoMutable(
            int id,
            Guid guid,
            byte[] userKey,
            byte[] adminKey,
            byte[] seed,
            LockingState state)
        {
            LockInfo = new LockInfo.Builder() { Id = id, Guid = guid, UserKey = userKey, AdminKey = adminKey, Seed = seed, State = state }.Build();
        }

        public int Id => LockInfo.Id;

        /// <summary> Changes during runtime: Can be unknown when set from copri and chang to a valid value when set from lock.</summary>
        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;

        public LockingState State 
        {
            get => LockInfo.State;
            set => LockInfo = new LockInfo.Builder(LockInfo) { State = value }.Build(); 
        }

        /// <summary> Holds the percentage of lock battery.</summary>
        public double BatteryPercentage { get; set; } = double.NaN;

        /// <summary> Loads lock info object from values. </summary>
        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();
        }
    }
}