private static void FixArkhamDbCardImageSource(ArkhamDbCard arkhamDbCard)
        {
            string arkhamDbPrefix = "https://arkhamdb.com/";

            if (!string.IsNullOrEmpty(arkhamDbCard.ImageSrc) && !arkhamDbCard.ImageSrc.StartsWith(arkhamDbPrefix))
            {
                arkhamDbCard.ImageSrc = arkhamDbPrefix + arkhamDbCard.ImageSrc;
            }
            if (!string.IsNullOrEmpty(arkhamDbCard.BackImageSrc) && !arkhamDbCard.BackImageSrc.StartsWith(arkhamDbPrefix))
            {
                arkhamDbCard.BackImageSrc = arkhamDbPrefix + arkhamDbCard.BackImageSrc;
            }
        }
        public void LoadPlayerCards(Player player)
        {
            if (player.Slots == null)
            {
                _logger.LogWarning($"{player.ID} has no cards in deck.");
                return;
            }

            _logger.LogMessage($"Loading cards for player {player.ID}.");

            // TODO: Consider alternatives to loading all cards
            var localCards = _localCardsService.LoadLocalCards();

            player.CardGroup.Loading = true;
            try {
                var cards = new List <CardInfo>();
                foreach (var slot in player.Slots)
                {
                    ArkhamDbCard arkhamDbCard = _arkhamDbService.GetCard(slot.Key);
                    if (arkhamDbCard != null)
                    {
                        // Override card image with local card if possible
                        FindCardImageSource(arkhamDbCard, localCards);

                        var card = new CardInfo(arkhamDbCard, slot.Value, true);

                        _cardImageService.LoadImage(card);

                        cards.Add(card);

                        // Look for bonded cards if present
                        cards.AddRange(GetBondedCards(arkhamDbCard, localCards));
                    }
                    else
                    {
                        _logger.LogError($"Could not find player {player.ID} card: {slot.Key}");
                    }
                }
                Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
                    player.CardGroup.LoadCards(cards);
                }));
            } catch (Exception ex) {
                _logger.LogException(ex, $"Error loading cards for player {player.ID}.");
            } finally {
                player.CardGroup.Loading = false;
            }
            _logger.LogMessage($"Finished loading cards for player {player.ID}.");
        }
        private static void FindCardImageSource(ArkhamDbCard arkhamDbCard, List <LocalManifestCard> localCards, bool removeLocalCard = false)
        {
            FixArkhamDbCardImageSource(arkhamDbCard);

            var localCard = localCards.FirstOrDefault(c => c.ArkhamDbId == arkhamDbCard.Code);

            if (localCard != null)
            {
                arkhamDbCard.ImageSrc = localCard.FilePath;
                if (localCard.HasBack)
                {
                    arkhamDbCard.BackImageSrc = localCard.BackFilePath;
                }
                if (removeLocalCard)
                {
                    localCards.Remove(localCard);
                }
            }
        }
            public Dictionary <ArkhamDbCard, int> GetBondedCards(ArkhamDbCard card)
            {
                Initialize();

                if (!(card is ArkhamDbFullCard mainCard))
                {
                    mainCard = allCards.FirstOrDefault(c => c.Code.Equals(card.Code));
                }

                var bondedCards = new Dictionary <ArkhamDbCard, int>();

                if (mainCard != null && mainCard.Bonded_Cards != null)
                {
                    foreach (var bondedCard in mainCard.Bonded_Cards)
                    {
                        bondedCards.Add(allCards.FirstOrDefault(c => c.Code.Equals(bondedCard.Code)), bondedCard.Count);
                    }
                }
                return(bondedCards);
            }
        private IEnumerable <CardInfo> GetBondedCards(ArkhamDbCard arkhamDbCard, List <LocalManifestCard> localCards)
        {
            if (arkhamDbCard is ArkhamDbFullCard fullCard && fullCard.Bonded_Cards?.Any() == true)
            {
                foreach (var bondedCardInfo in fullCard.Bonded_Cards)
                {
                    ArkhamDbCard bondedArkhamDbCard = _arkhamDbService.GetCard(bondedCardInfo.Code);
                    if (bondedArkhamDbCard != null)
                    {
                        // Override card image with local card if possible
                        FindCardImageSource(bondedArkhamDbCard, localCards);

                        var bondedCard = new CardInfo(bondedArkhamDbCard, bondedCardInfo.Count, isPlayerCard: true, isBonded: true);
                        _cardImageService.LoadImage(bondedCard);
                        yield return(bondedCard);
                    }
                    else
                    {
                        _logger.LogError($"Could not find bonded card: {bondedCardInfo.Code}, bonded to: {arkhamDbCard.Code}");
                    }
                }
            }
        }