IReadOnlyDictionary <CurrencyCode, SumState> CalculateAssetSums(
            AssetISIN isin, IReadOnlyCollection <VirtualAsset> allAssets, DateTimeOffset date)
        {
            var assets = allAssets
                         .Where(a => a.Isin == isin)
                         .ToArray();

            if (assets.Length == 0)
            {
                return(new Dictionary <CurrencyCode, SumState>());
            }
            var baseCurrency   = assets[0].Currency;
            var baseRealSum    = assets.Sum(a => a.RealSum);
            var baseVirtualSum = assets.Sum(a => a.VirtualSum);

            return(_currencyConfig.GetAll()
                   .ToDictionary(
                       c => c,
                       c => {
                if (c == baseCurrency)
                {
                    return new SumState(baseRealSum, baseVirtualSum);
                }
                var realSum = _exchangeManager.Exchange(baseCurrency, c, baseRealSum, date);
                var virtualSum = _exchangeManager.Exchange(baseCurrency, c, baseRealSum, date);
                return new SumState(realSum, virtualSum);
            }
                       ));
        }
        public IActionResult Get([Required] DateTimeOffset date)
        {
            var userId = new UserId(User.Identity?.Name ?? string.Empty);

            _logger.LogInformation($"Retrieve state for user '{userId}' at {date}");
            var state   = _readUseCase.Handle(date, userId);
            var brokers = state.Brokers
                          .Select(b => new BrokerDto(
                                      b.Id,
                                      b.DisplayName,
                                      b.Accounts
                                      .Select(a => new AccountDto(a.Id, a.Currency, a.DisplayName, a.Balance))
                                      .ToArray(),
                                      b.Inventory
                                      .Select(a => new AssetDto(a.Id, a.Isin, a.Count))
                                      .ToArray()))
                          .ToArray();
            var currencies = _currencyConfig.GetAll()
                             .Select(c => new CurrencyDto(c, _currencyConfig.GetFormat(c)))
                             .ToArray();
            var dto = new StateDto(brokers, currencies);

            return(new JsonResult(dto));
        }