using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using TINK.Model.Bike.BluetoothLock;
using TINK.Services.BluetoothLock.Tdo;

namespace TestTINKLib.Fixtures.ObjectTests.Bike.BluetoothLock
{
    [TestFixture]
    public class TestLockInfoHelper
    {
        [Test]
        public void TestUpdateById_State()
        {
            var locksInfo = new List<LockInfo> { 
                new LockInfo.Builder { Id = 12, Seed = new byte[] { 3, 5 }, UserKey = new byte[] {2, 1 }, State = LockingState.Unknown }.Build(),
                new LockInfo.Builder { Id = 14, Seed = new byte[] { 3, 1 }, UserKey = new byte[] {2, 7 }, State = LockingState.Open }.Build(),
                new LockInfo.Builder { Id = 3, Seed = new byte[] { 1, 5 }, UserKey = new byte[] {2, 9 }, State = LockingState.Closed }.Build(),
            };

            var locksInfoTdo = new List<LockInfoTdo> {
                new LockInfoTdo.Builder { Id =14, State = LockitLockingState.Closed}.Build()
                };

            var resultList = locksInfo.UpdateById(locksInfoTdo);

            var result = resultList.FirstOrDefault(x => x.Id == 14);
            Assert.NotNull(result, "Target element was removed.");
            Assert.AreEqual(LockingState.Closed, result.State);
        }

        [Test]
        public void TestUpdateById_Guid()
        {
            var locksInfo = new List<LockInfo> {
                new LockInfo.Builder { Id = 12, Seed = new byte[] { 3, 5 }, UserKey = new byte[] {2, 1 }, State = LockingState.Unknown }.Build(),
                new LockInfo.Builder { Id = 14, Seed = new byte[] { 3, 1 }, UserKey = new byte[] {2, 7 }, State = LockingState.Open }.Build(),
                new LockInfo.Builder { Id = 3, Seed = new byte[] { 1, 5 }, UserKey = new byte[] {2, 9 }, State = LockingState.Closed }.Build(),
            };

            var locksInfoTdo = new List<LockInfoTdo> {
                new LockInfoTdo.Builder { Id =14, Guid = new System.Guid("00000000-0000-0000-0000-e57e6b9aee16"), State = LockitLockingState.Open}.Build()
                };

            var resultList = locksInfo.UpdateById(locksInfoTdo);

            var result = resultList.FirstOrDefault(x => x.Id == 14);
            Assert.NotNull(result, "Target element was removed.");
            Assert.AreEqual(new Guid("00000000-0000-0000-0000-e57e6b9aee16"), result.Guid);
        }
    }
}