using AyCode.Core.Enums;
using AyCode.Core.Loggers;
using AyCode.Utils.Extensions;
using FruitBank.Common;
using FruitBank.Common.Dtos;
using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces;
using FruitBank.Common.Loggers;
using FruitBankHybrid.Shared.Services.SignalRs;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices.JavaScript;
using System.Security.Cryptography.X509Certificates;

// ReSharper disable CompareOfFloatsByEqualityOperator

namespace FruitBankHybrid.Shared.Tests
{
    [TestClass]
    public sealed class FruitBankClientTests
    {
        private const int CustomerIdAasdDsserverCom = 6;//aasd@dsserver.com
        private const string Fixture = "_test.temp";

        private FruitBankSignalRClient _signalRClient = null!;

        private static string GetFixtureName(string name) => $"{GetOriginalName(name)}{Fixture}";
        private static string GetOriginalName(string name) => name.Replace(Fixture, string.Empty);

        [TestInitialize]
        public void TestInit()
        {
            if (!FruitBankConstClient.BaseUrl.Contains("localhost:")) throw new Exception("NEM LOCALHOST-ON TESZTELÜNK!");

            _signalRClient = TestSignalRClientFactory.Create(nameof(FruitBankClientTests));
        }

        #region Shipping
        [TestMethod]
        public async Task GetShippingsTest()
        {
            var shippings = await _signalRClient.GetShippings();

            Assert.IsNotNull(shippings);
            Assert.IsNotEmpty(shippings);
        }

        [TestMethod]
        public async Task GetNotMeasuredShippingsTest()
        {
            var shippings = await _signalRClient.GetNotMeasuredShippings();

            Assert.IsNotNull(shippings);
            var ShippingMeasuredDateAddDay = 1000; //dfd
            Assert.IsTrue(shippings.All(s => !s.IsAllMeasured || s.MeasuredDate != null || s.MeasuredDate < DateTime.Now.AddDays(ShippingMeasuredDateAddDay)));
        }

        //[TestMethod]
        //[DataRow(1)]
        public async Task<Shipping> GetShippingByIdTest(int shippingId)
        {
            var shipping = await _signalRClient.GetShippingById(shippingId);

            Assert.IsNotNull(shipping);
            Assert.IsNotNull(shipping.ShippingDocuments);

            Assert.IsTrue(shipping.Id == shippingId);
            Assert.IsTrue(shipping.ShippingDocuments.All(s => s.ShippingId == shippingId));
            Assert.IsTrue(shipping.ShippingDocuments.All(sd => sd.ShippingItems != null && sd.ShippingItems.Any(si => si.ShippingDocumentId == sd.Id)));

            return shipping;
        }

        [DataTestMethod]
        [DataRow(1)]
        public async Task UpdateShippingTest(int shippingId)
        {
            var shipping = await GetShippingByIdTest(shippingId);
            var newLicencePlate = GetFixtureName(shipping.LicencePlate);

            shipping.LicencePlate = newLicencePlate;
            await _signalRClient.UpdateShipping(shipping);

            shipping = await GetShippingByIdTest(shippingId);
            
            Assert.IsTrue(shipping.Id == shippingId);
            Assert.IsTrue(shipping.LicencePlate == newLicencePlate);

            shipping.LicencePlate = GetOriginalName(shipping.LicencePlate);
            await _signalRClient.UpdateShipping(shipping);

            Assert.IsTrue(shipping.Id == shippingId);
        }

        #endregion Shipping

        #region ShippingItem

        [TestMethod]
        public async Task GetShippingItemsTest()
        {
            var shippingItems = await _signalRClient.GetShippingItems();

            Assert.IsNotNull(shippingItems);
            Assert.IsTrue(shippingItems.Count != 0);

            Assert.IsTrue(shippingItems.All(si => si.ProductDto?.Id == si.ProductId), "shippingItem.Product == null");

            Assert.IsTrue(shippingItems.All(x => double.Round(x.ShippingItemPallets!.Where(sp => sp.IsMeasured).Sum(sp => sp.GrossWeight), 1) == x.MeasuredGrossWeight));
            Assert.IsTrue(shippingItems.All(x => double.Round(x.ShippingItemPallets!.Where(sp => sp.IsMeasured).Sum(sp => sp.NetWeight), 1) == x.MeasuredNetWeight));

            await ValidateProductValues(shippingItems.Where(si => si.ProductId.GetValueOrDefault(0) > 0).GroupBy(x => x.ProductId!.Value, si => si).ToDictionary(k => k.Key, v => v.ToList()));

            var rnd = new Random();
            foreach (var shippingItem in shippingItems)
            {
                await UpdateShippingItemAsync(shippingItem.Id, rnd.Next(-10, 10), rnd.NextDouble() + rnd.Next(-3, 3), rnd.NextDouble() + rnd.Next(-5, 5), rnd.NextDouble() + rnd.Next(-1, 1));
            }

            shippingItems = await _signalRClient.GetShippingItems();
            Assert.IsNotNull(shippingItems);

            await ValidateProductValues(shippingItems.Where(si => si.ProductId.GetValueOrDefault(0) > 0).GroupBy(x => x.ProductId!.Value, si => si).ToDictionary(k => k.Key, v => v.ToList()));
        }

        private async Task ValidateProductValues(Dictionary<int, List<ShippingItem>> shippingItemsByProductId)
        {
            foreach (var (key, shippingItems) in shippingItemsByProductId)
            {
                var productDto = await _signalRClient.GetProductDtoById(key);

                Assert.IsNotNull(productDto);
                Assert.IsTrue(shippingItems.Where(si => si.ProductId == productDto.Id).All(si => si.ProductDto!.StockQuantity == productDto.StockQuantity));

                var shippingItemSumQnty = shippingItems.Where(x => x.IsMeasured && x.ProductId == productDto.Id).Sum(x => x.MeasuredQuantity);
                Assert.IsTrue(shippingItemSumQnty == productDto.StockQuantity, $"{productDto}; shippingItemSum Quantity: {shippingItemSumQnty} == {productDto.StockQuantity}");

                if (!productDto.IsMeasurable) continue;

                //var shippingItemSumWeight = double.Round(shippingItems.Where(x => x.IsMeasured && x.ProductId == productDto.Id).Sum(x => x.MeasuredNetWeight), 1);
                //Assert.IsTrue(shippingItemSumWeight == productDto!.NetWeight, $"{productDto}; shippingItemSum NetWeight: {shippingItemSumWeight} == {productDto.NetWeight}");

                //shippingItemSumWeight = double.Round(shippingItems.Where(x => x.IsMeasured && x.ProductId == productDto.Id).Sum(x => x.MeasuredGrossWeight), 1);
            }
        }

        [TestMethod]
        [DataRow(1, true)]
        [DataRow(2, true)]
        [DataRow(3, false)]
        [DataRow(4, false)]
        public async Task GetShippingItemByIdTest(int shippingItemId, bool shippingDocumentFileExcepted)
        {
            var shippingItem = await GetShippingItemByIdAsync(shippingItemId);

            if (shippingDocumentFileExcepted) Assert.IsTrue(shippingItem.ShippingDocument?.ShippingDocumentToFiles?.FirstOrDefault()?.ShippingDocumentFile?.Id == 1);
            else
            {
                Assert.IsNotNull(shippingItem.ShippingDocument);
                Assert.AreEqual(0, shippingItem.ShippingDocument.ShippingDocumentToFiles?.Count);
            }
        }

        [return: NotNull]
        public async Task<ShippingItem> GetShippingItemByIdAsync(int shippingItemId)
        {
            var shippingItem = await _signalRClient.GetShippingItemById(shippingItemId);

            Assert.IsNotNull(shippingItem, $"shippingItemId: {shippingItemId}");

            if (shippingItem.IsMeasurable) Assert.IsNotNull(shippingItem.Pallet, $"shippingItem.Pallet == null; shippingItem.PalletId: {shippingItem.PalletId}");

            Assert.IsNotNull(shippingItem.ProductDto, $"shippingItem.Product == null; shippingItem.ProductId: {shippingItem.ProductId}");
            Assert.AreEqual(shippingItemId, shippingItem.Id);

            Assert.IsGreaterThan(0, shippingItem.QuantityOnDocument, "QuantityOnDocument == 0");
            Assert.IsGreaterThan(0, shippingItem.NetWeightOnDocument, "NetWeightOnDocument == 0");
            Assert.IsGreaterThan(0, shippingItem.GrossWeightOnDocument, "GrossWeightOnDocument == 0");

            return shippingItem;
        }

        [DataTestMethod]
        [DataRow(1, 1, 0, 1, 0)]
        [DataRow(1, -1, -2.137563300001, -33.75238200001, 2.12545)]
        [DataRow(1, 1, 2.137563300001, 390.75238200001, 2.12545)]
        [DataRow(1, 1, 20.137563300001, 3.75238200001, 2.12545)]
        [DataRow(2, -1, -20.137563300001, 3.75238200001, 2.12545)]
        [DataRow(2, -1, 20.137563300001, 3.75238200001, 2.12545)]
        [DataRow(3, 1, 2.137563300001, 1.75238200001, 2.12545)]
        [DataRow(3, 1, 2.137563300001, 3.75238200001, 2.12545)]
        [DataRow(4, 13, 2.137563300001, 3.75238200001, 2.12545)]
        [DataRow(5, 1, 2.137563300001, 3.75238200001, 2.12545)]
        [DataRow(5, -1, 2.137563300001, 3.75238200001, 2.12545)]
        public async Task UpdateShippingItemTest(int shippingItemId, int incQuantity, double incPalletWeight, double incGrossWeight, double incTare)
        {
            Assert.IsTrue(true);
            return;
            await UpdateShippingItemAsync(shippingItemId, incQuantity, incPalletWeight, incGrossWeight, incTare);
        }

        public async Task UpdateShippingItemAsync(int shippingItemId, int incQuantity, double incPalletWeight, double incGrossWeight, double incTare)
        {
            incPalletWeight = double.Round(incPalletWeight, 0);
            Console.WriteLine($"params: {shippingItemId}; {incQuantity}; {incPalletWeight}; {incGrossWeight}; {incTare}");

            var originalShippingItem = await GetShippingItemByIdAsync(shippingItemId);
            Console.WriteLine($"{originalShippingItem}");

            var productDto = await GetProductDtoByIdAsync(originalShippingItem.ProductId!.Value, originalShippingItem.IsMeasurable);
            
            Assert.IsTrue(originalShippingItem.IsMeasurable == productDto.IsMeasurable);
            Console.WriteLine($"{productDto}; NetWeight: {productDto.NetWeight}");

            var shippingItemPallet = originalShippingItem.ShippingItemPallets!.FirstOrDefault();

            if (shippingItemPallet == null)
            {
                shippingItemPallet = new ShippingItemPallet { ShippingItemId = originalShippingItem.Id, PalletWeight = originalShippingItem.Pallet?.Weight ?? 0 };
                originalShippingItem.ShippingItemPallets!.Add(shippingItemPallet);
            }

            Assert.IsNotNull(shippingItemPallet);

            var nullResultIsValid = originalShippingItem.IsMeasured && !originalShippingItem.IsValidMeasuringValues();
            nullResultIsValid = nullResultIsValid || originalShippingItem.ShippingItemPallets!.Any(x => !x.IsValidMeasuringValues(productDto.IsMeasurable));
            nullResultIsValid = nullResultIsValid || originalShippingItem.ShippingItemPallets!.Any(x => !x.IsValidSafeMeasuringValues());

            var originalPalletNetWeight = shippingItemPallet.NetWeight;

            shippingItemPallet.TrayQuantity += incQuantity;
            shippingItemPallet.GrossWeight += incGrossWeight;
            shippingItemPallet.PalletWeight += incPalletWeight;
            shippingItemPallet.TareWeight += incTare;

            var incNetWeight = productDto.IsMeasurable ? double.Round(shippingItemPallet.NetWeight - originalPalletNetWeight, 1) : 0;

            //shippingItem = await _signalRClient.UpdateShippingItem(shippingItem);
            var dbShippingItemPallet = await _signalRClient.UpdateShippingItemPallet(shippingItemPallet);

            //A szerver oldal 0-ra állítja a shippingItemPallet weight-eket, ha nem mérhető! - J.
            if (!productDto.IsMeasurable)
            {
                shippingItemPallet.GrossWeight = 0;
                shippingItemPallet.PalletWeight = 0;
                shippingItemPallet.TareWeight = 0;
            }

            if (nullResultIsValid || !shippingItemPallet.IsValidSafeMeasuringValues())
            {
                Assert.IsNull(dbShippingItemPallet);
                return;
            }

            //if (dbShippingItemPallet == null) return;

            Assert.IsNotNull(dbShippingItemPallet);
            Assert.IsTrue(dbShippingItemPallet.TareWeight == shippingItemPallet.TareWeight);
            Assert.IsTrue(dbShippingItemPallet.TrayQuantity == shippingItemPallet.TrayQuantity);
            Assert.IsTrue(dbShippingItemPallet.GrossWeight == shippingItemPallet.GrossWeight);
            Assert.IsTrue(dbShippingItemPallet.PalletWeight == shippingItemPallet.PalletWeight);
            Assert.IsTrue(dbShippingItemPallet.ShippingItemId == shippingItemPallet.ShippingItemId);
            Assert.IsTrue(dbShippingItemPallet.NetWeight == double.Round(originalPalletNetWeight + incNetWeight, 1));

            var shippingItem = await _signalRClient.GetShippingItemById(dbShippingItemPallet.ShippingItemId);

            Assert.IsNotNull(shippingItem);
            Assert.IsNotNull(shippingItem.ProductDto);
            Assert.IsNotNull(shippingItem.ShippingItemPallets);

            Assert.IsTrue(shippingItem.IsMeasurable == productDto.IsMeasurable);

            //var incNetWeight = productDto.IsMeasurable ? double.Round(dbShippingItemPallet.NetWeight - originalPalletNetWeight, 1) : 0;
            incGrossWeight = productDto.IsMeasurable ? double.Round(incGrossWeight, 1) : 0;

            var isMeasuredPalletsCount = shippingItem.ShippingItemPallets!.Count(x => x.IsMeasured);

            Assert.IsTrue(shippingItem.MeasuredNetWeight == double.Round(originalShippingItem.MeasuredNetWeight + incNetWeight, 1));
            Assert.IsTrue(shippingItem.IsMeasured == (shippingItem.ShippingItemPallets!.All(x => x.IsMeasured) && shippingItem.MeasuringCount == isMeasuredPalletsCount));

            if (shippingItem.IsMeasured)
            {
                Assert.IsTrue(shippingItem.IsValidMeasuringValues());
                Assert.IsTrue(shippingItem.MeasuringCount == isMeasuredPalletsCount);
                Assert.IsTrue(shippingItem.ProductDto.StockQuantity == originalShippingItem.ProductDto!.StockQuantity + incQuantity);
                Assert.IsTrue(shippingItem.ProductDto.IncomingQuantity == productDto.IncomingQuantity - incQuantity);

                var dbProductDto = await GetProductDtoByIdAsync(originalShippingItem.ProductId!.Value, shippingItem.IsMeasurable);

                Assert.IsTrue(dbProductDto.StockQuantity == productDto.StockQuantity + incQuantity);
                Assert.IsTrue(dbProductDto.IncomingQuantity == productDto.IncomingQuantity - incQuantity);
                Assert.IsTrue(dbProductDto.NetWeight == double.Round(productDto.NetWeight + (shippingItem.IsMeasurable ? incNetWeight : 0), 1));
            }
            else
            {
                incQuantity = 0;
                incNetWeight = 0;
                incGrossWeight = 0;

                Assert.IsTrue(shippingItem.MeasuringCount > isMeasuredPalletsCount);
            }

            Assert.IsTrue(shippingItem.MeasuredQuantity == originalShippingItem.MeasuredQuantity + incQuantity);
            
            Assert.IsTrue(shippingItem.ShippingItemPallets!.All(x => x.IsValidSafeMeasuringValues()));
            Assert.IsTrue(shippingItem.ShippingItemPallets!.All(x => x.IsValidMeasuringValues(shippingItem.IsMeasurable)));

            Assert.IsTrue(shippingItem.MeasuredNetWeight == double.Round(originalShippingItem.MeasuredNetWeight + (shippingItem.IsMeasurable ? incNetWeight : 0), 1));
            Assert.IsTrue(shippingItem.MeasuredGrossWeight == double.Round(originalShippingItem.MeasuredGrossWeight + (shippingItem.IsMeasurable ? incGrossWeight : 0), 1));
        }

        #endregion ShippingItem

        #region ShippingDocument

        [TestMethod]
        public async Task GetShippingDocumentsTest()
        {
            var shippingDocuments = await _signalRClient.GetShippingDocuments();

            Assert.IsNotNull(shippingDocuments);
            Assert.IsTrue(shippingDocuments.Count != 0);
            Assert.IsTrue(shippingDocuments.Any(x => x.ShippingDocumentToFiles?.Count > 0));
        }

        [TestMethod]
        [DataRow(2, true)]
        [DataRow(3, false)]
        [DataRow(4, false)]
        public async Task GetShippingDocumentByIdTest(int shippingDocumentId, bool shippingDocumentFileExcepted)
        {
            var shippingDocument = await GetShippingDocumentByIdAsync(shippingDocumentId);

            if (shippingDocumentFileExcepted) Assert.IsTrue(shippingDocument.ShippingDocumentToFiles?.FirstOrDefault()?.ShippingDocumentFile?.Id == 1);
            else
            {
                Assert.IsTrue(shippingDocument.ShippingDocumentToFiles?.Count == 0);
            }
        }

        [return: NotNull]
        public async Task<ShippingDocument> GetShippingDocumentByIdAsync(int shippingDocumentId)
        {
            var shippingDocument = await _signalRClient.GetShippingDocumentById(shippingDocumentId);

            Assert.IsNotNull(shippingDocument);
            Assert.IsTrue(shippingDocument.Id == shippingDocumentId);

            return shippingDocument;
        }

        [DataTestMethod]
        [DataRow(2)]
        public async Task UpdateShippingDocumentTest(int shippingDocumentId)
        {
            var shippingDocument = await GetShippingDocumentByIdAsync(shippingDocumentId);
            var newCountry = GetFixtureName(shippingDocument.Country);

            shippingDocument.Country = newCountry;
            await _signalRClient.UpdateShippingDocument(shippingDocument);

            shippingDocument = await GetShippingDocumentByIdAsync(shippingDocumentId);
            
            Assert.IsTrue(shippingDocument.Country == newCountry);
            Assert.IsTrue(shippingDocument.ShippingDocumentToFiles?.FirstOrDefault()?.ShippingDocumentFile?.Id == 1);

            shippingDocument.Country = GetOriginalName(shippingDocument.Country);
            await _signalRClient.UpdateShippingDocument(shippingDocument);
        }

        #endregion ShippingDocument

        #region Customer

        [TestMethod]
        public async Task GetMeasuringUsersTest()
        {
            var users = await _signalRClient.GetMeasuringUsers();

            Assert.IsNotNull(users);
            Assert.IsTrue(users.Count != 0);
            Assert.IsTrue(users.All(x => !x.Email.IsNullOrEmpty() && !x.Deleted));
        }

        //[TestMethod]
        //[DataRow(CustomerIdAasdDsserverCom)]
        //public async Task GetCustomerRolesByCustomerIdTest(int customerId)
        //{
        //    var customerRoles = await _signalRClient.GetCustomerRolesByCustomerId(customerId);

        //    Assert.IsNotNull(customerRoles);
        //    Assert.IsTrue(customerRoles.Count > 0);
        //    Assert.IsTrue(customerRoles.Any(cr => cr.SystemName == "Measuring"));
        //}

        #endregion Customer

        #region Product

        [TestMethod]
        public async Task GetProductDtosTest()
        {
            var productDtos = await _signalRClient.GetProductDtos();

            Assert.IsNotNull(productDtos);
            Assert.IsTrue(productDtos.Count != 0);
            Assert.IsTrue(productDtos.All(x => !x.Name.IsNullOrEmpty() && !x.Deleted));
        }

        [TestMethod]
        [DataRow(1, true)]
        [DataRow(5, true)]
        //[DataRow(6, false)]
        [DataRow(33, true)]
        //[DataRow(64, false)]
        [DataRow(7, true)]
        public async Task GetProductDtoByIdTest(int productId, bool isMeasurableExcepted)
        {
            await GetProductDtoByIdAsync(productId, isMeasurableExcepted);
        }

        public async Task<ProductDto> GetProductDtoByIdAsync(int productId, bool isMeasurableExcepted)
        {
            var productDto = await _signalRClient.GetProductDtoById(productId);

            Assert.IsNotNull(productDto);

            //if (productDto.Id == 6) return productDto;

            if (isMeasurableExcepted) Assert.IsTrue(productDto.HasMeasuringValues(), $"{productDto} {productDto.IsMeasurable}, {productDto.NetWeight}");
            else
            {
                Assert.IsTrue(productDto.Id > 0);
                Assert.IsTrue(productDto.StockQuantity >= 0);
                Assert.IsTrue(productDto.NetWeight == 0);

                Assert.IsFalse(productDto.IsMeasurable);
            }

            return productDto;
        }

        #endregion Product

        #region OrderItem

        [DataTestMethod]
        [DataRow(1)]
        public async Task GetOrderDtoByIdTest(int orderId) => await GetOrderDtoByIdAsync(orderId);

        [return: NotNull]
        public async Task<OrderDto> GetOrderDtoByIdAsync(int orderId)
        {
            var orderDto = await _signalRClient.GetOrderDtoById(orderId);

            ValidateOrderDto(orderId, orderDto);

            return orderDto!;
        }

        private static bool ValidateOrderDto(int orderId, [NotNullWhen(true)] OrderDto? orderDto)
        {
            Assert.IsNotNull(orderDto, $"orderId: {orderId}");
            Assert.IsNotNull(orderDto.Customer);

            Assert.IsTrue(orderDto.Id == orderId);
            Assert.IsTrue(orderDto.OrderItemDtos.Count > 0);

            Assert.IsTrue(orderDto.OrderItemDtos.All(oi => oi.ProductDto != null));

            return true;
        }

        //[DataTestMethod]
        //[DataRow(1, -1, -2.137563300001, -333.75238200001, 2.12545)]
        //[DataRow(1, 1, 2.137563300001, 3.75238200001, 2.12545)]
        //[DataRow(1, 1, 20.137563300001, 3.75238200001, 2.12545)]
        //[DataRow(2, -1, -20.137563300001, 3.75238200001, 2.12545)]
        //[DataRow(2, -1, 20.137563300001, 3.75238200001, 2.12545)]
        //[DataRow(3, 1, 2.137563300001, 1.75238200001, 2.12545)]
        //[DataRow(3, 1, 2.137563300001, 3.75238200001, 2.12545)]
        //[DataRow(4, 13, 2.137563300001, 3.75238200001, 2.12545)]
        //[DataRow(5, 1, 2.137563300001, 3.75238200001, 2.12545)]
        //[DataRow(5, -1, 2.137563300001, 3.75238200001, 2.12545)]
        //public async Task UpdateOrderItemTest(int shippingItemId, int incQuantity, double incPalletWeight, double incGrossWeight, double incTare)
        //{
        //    Assert.IsTrue(true);
        //    return;
        //    await UpdateOrderItemAsync(shippingItemId, incQuantity, incPalletWeight, incGrossWeight, incTare);
        //}

        //public async Task UpdateOrderItemAsync(int shippingItemId, int incQuantity, double incPalletWeight, double incGrossWeight, double incTare)
        //{
        //var originalShippingItem = await GetShippingItemByIdAsync(shippingItemId);
        //    var productDto = await GetProductDtoByIdAsync(originalShippingItem.ProductId!.Value, originalShippingItem.IsMeasurable);

        //    Assert.IsTrue(originalShippingItem.IsMeasurable == productDto.IsMeasurable);

        //    var shippingItem = await GetShippingItemByIdAsync(shippingItemId);

        //    var shippingItemPallet = shippingItem.ShippingItemPallets!.FirstOrDefault();

        //    if (shippingItemPallet == null)
        //    {
        //        shippingItemPallet = new ShippingItemPallet { ShippingItemId = shippingItem.Id, PalletWeight = shippingItem.Pallet?.Weight ?? 0 };
        //        shippingItem.ShippingItemPallets!.Add(shippingItemPallet);
        //    }

        //    Assert.IsNotNull(shippingItemPallet);

        //    var nullResultIsValid = shippingItem.IsMeasured && !shippingItem.IsValidMeasuringValues();
        //    nullResultIsValid = nullResultIsValid || shippingItem.ShippingItemPallets!.Any(x => !x.IsValidMeasuringValues(productDto.IsMeasurable));
        //    nullResultIsValid = nullResultIsValid || shippingItem.ShippingItemPallets!.Any(x => !x.IsValidSafeMeasuringValues());

        //    shippingItemPallet.TrayQuantity += incQuantity;
        //    shippingItemPallet.GrossWeight += incGrossWeight;
        //    shippingItemPallet.PalletWeight += incPalletWeight;
        //    shippingItemPallet.TareWeight += incTare;

        //    //shippingItem = await _signalRClient.UpdateShippingItem(shippingItem);
        //    var dbShippingItemPallet = await _signalRClient.UpdateShippingItemPallet(shippingItemPallet);

        //    //A szerver oldal 0-ra állítja a shippingItemPallet weight-eket, ha nem mérhető! - J.
        //    if (!productDto.IsMeasurable)
        //    {
        //        shippingItemPallet.GrossWeight = 0;
        //        shippingItemPallet.PalletWeight = 0;
        //        shippingItemPallet.TareWeight = 0;
        //    }

        //    if (nullResultIsValid || !shippingItemPallet.IsValidSafeMeasuringValues())
        //    {
        //        Assert.IsNull(dbShippingItemPallet);
        //        return;
        //    }

        //    Assert.IsNotNull(dbShippingItemPallet);
        //    Assert.IsTrue(dbShippingItemPallet.TareWeight == shippingItemPallet.TareWeight);
        //    Assert.IsTrue(dbShippingItemPallet.TrayQuantity == shippingItemPallet.TrayQuantity);
        //    Assert.IsTrue(dbShippingItemPallet.GrossWeight == shippingItemPallet.GrossWeight);
        //    Assert.IsTrue(dbShippingItemPallet.PalletWeight == shippingItemPallet.PalletWeight);
        //    Assert.IsTrue(dbShippingItemPallet.ShippingItemId == shippingItemPallet.ShippingItemId);

        //    shippingItem = await _signalRClient.GetShippingItemById(dbShippingItemPallet.ShippingItemId);

        //    Assert.IsNotNull(shippingItem);
        //    Assert.IsNotNull(shippingItem.ProductDto);
        //    Assert.IsNotNull(shippingItem.ShippingItemPallets);
        //    Assert.IsTrue(shippingItem.IsMeasurable == productDto.IsMeasurable);

        //    incGrossWeight = productDto.IsMeasurable ? double.Round(incGrossWeight, 1) : 0;
        //    var incNetWeight = productDto.IsMeasurable ? double.Round((incGrossWeight - incPalletWeight) - (incQuantity * incTare), 1) : 0;

        //    var isMeasuredPalletsCount = shippingItem.ShippingItemPallets!.Count(x => x.IsMeasured);

        //    Assert.IsTrue(shippingItem.IsMeasured == (shippingItem.ShippingItemPallets!.All(x => x.IsMeasured) && shippingItem.MeasuringCount == isMeasuredPalletsCount));

        //    if (shippingItem.IsMeasured)
        //    {
        //        Assert.IsTrue(shippingItem.IsValidMeasuringValues());
        //        Assert.IsTrue(shippingItem.MeasuringCount == isMeasuredPalletsCount);
        //        Assert.IsTrue(shippingItem.ProductDto.StockQuantity == originalShippingItem.ProductDto!.StockQuantity + incQuantity);
        //        Assert.IsTrue(shippingItem.ProductDto.IncomingQuantity == productDto.IncomingQuantity - incQuantity);

        //        var dbProductDto = await GetProductDtoByIdAsync(originalShippingItem.ProductId!.Value, shippingItem.IsMeasurable);

        //        Assert.IsTrue(dbProductDto.StockQuantity == productDto.StockQuantity + incQuantity);
        //        Assert.IsTrue(dbProductDto.IncomingQuantity == productDto.IncomingQuantity - incQuantity);
        //        Assert.IsTrue(dbProductDto.NetWeight == double.Round(productDto.NetWeight + (shippingItem.IsMeasurable ? incNetWeight : 0), 1));

        //    }
        //    else
        //    {
        //        incQuantity = 0;
        //        incNetWeight = 0;
        //        incGrossWeight = 0;

        //        Assert.IsTrue(shippingItem.MeasuringCount > isMeasuredPalletsCount);
        //    }

        //    Assert.IsTrue(shippingItem.MeasuredQuantity == originalShippingItem.MeasuredQuantity + incQuantity);

        //    Assert.IsTrue(shippingItem.ShippingItemPallets!.All(x => x.IsValidSafeMeasuringValues()));
        //    Assert.IsTrue(shippingItem.ShippingItemPallets!.All(x => x.IsValidMeasuringValues(shippingItem.IsMeasurable)));

        //    Assert.IsTrue(shippingItem.MeasuredNetWeight == double.Round(originalShippingItem.MeasuredNetWeight + (shippingItem.IsMeasurable ? incNetWeight : 0), 1));
        //    Assert.IsTrue(shippingItem.MeasuredGrossWeight == double.Round(originalShippingItem.MeasuredGrossWeight + (shippingItem.IsMeasurable ? incGrossWeight : 0), 1));
        //}
        #endregion OrderItem

        #region Login
        [TestMethod]
        [DataRow("aasd@dsserver.com", "Asdasd123456")]
        public async Task LoginMeasuringUserTest_TrueIfHasCustomerDto(string email, string password)
        {
            var loginModelResponse = await _signalRClient.LoginMeasuringUser(email, password);

            Assert.IsNotNull(loginModelResponse);
            Assert.IsNotNull(loginModelResponse.CustomerDto, loginModelResponse.ErrorMessage);

            Assert.IsTrue(loginModelResponse.CustomerDto.Email == email, loginModelResponse.ErrorMessage);
        }

        [TestMethod]
        [DataRow("adam.g@aycode.com", "123")]
        public async Task LoginMeasuringUserTest_TrueIfHasNotCustomerDto(string email, string password)
        {
            var loginModelResponse = await _signalRClient.LoginMeasuringUser(email, password);

            Assert.IsNotNull(loginModelResponse);
            Assert.IsNull(loginModelResponse.CustomerDto);

            Assert.IsFalse(loginModelResponse.ErrorMessage.IsNullOrWhiteSpace());
            Console.WriteLine($"Succes: {loginModelResponse.ErrorMessage}");
        }
        #endregion Login
    }
}
