public List<Card> getPayment(int pValue) {
    List<Card> lBankCardList = mBankArea.getCardList();

    // Order cards by high to low
    Collections.sort(lBankCardList, Collections.reverseOrder());

    // Quick search for exact value and then return that
    for (Card lCard : lBankCardList) {
      if (lCard.getMonetaryValue() == pValue) {
        lBankCardList.remove(lCard);
        return new ArrayList<>(Arrays.asList(lCard));
      }
    }

    // TODO AT - if we have 10 million here and asking for 5, the 10 will be used when there could
    // be a 5 underneath it this needs to be more intelligent
    // Otherwise return high to low in that order
    List<Card> lPaymentCards = new ArrayList<>();

    for (Card lCard : lBankCardList) {
      lPaymentCards.add(lCard);
      lBankCardList.remove(lCard);

      // Decrement rent required by how much the card was worth
      pValue = -lCard.getMonetaryValue();
      if (pValue < 0) {
        return lPaymentCards;
      }
    }

    // If rent is still due which should always be the case
    if (pValue > 0) {
      // Just look sequentially for now and sell properties until rent is paid
      for (List<Card> lPropertyList : mPropertyArea.values()) {
        for (Card lCard : lPropertyList) {
          lPaymentCards.add(lCard);
          lPropertyList.remove(lCard);

          // Decrement rent required by how much the card was worth
          pValue = -lCard.getMonetaryValue();
          if (pValue < 0) {
            return lPaymentCards;
          }
        }
      }
    }

    // If you run past this loop, there is no more money to give so just return the cards sold for
    // payment
    // and ignore the rest as the rules of the game state
    return lPaymentCards;
  }
  public void takeTurn(Match pMatch) {
    // Shuffle cards in hand at the start just so 3 different ones are played every turn at the
    // moment, randomly
    Collections.shuffle(mCardsInHand);

    System.out.println("Player is taking turn " + this.getName());

    // TODO AT - call AI to choose three cards and the information needed to play them.
    // Play three cards through match object
    for (int i = 0; i < 3; i++) {
      // TODO AT - at the moment just play the first three cards in the hand
      // TODO AT - depending on the type of card must choose
      // Target player if applicable? AI must chose this, start with no target player, just two
      // players in the game

      // Get card to play
      Card lCardToPlay = mCardsInHand.get(0);
      // if no more cards to play just skip turn
      if (lCardToPlay == null) {
        continue;
      }

      // Find a player that's not this one
      Player lTargetPlayer = null;
      for (Player lPlayer : pMatch.getPlayers()) {
        // If the player is not himself
        if (lPlayer != this) {
          // mark this player as the target
          lTargetPlayer = lPlayer;
        }
      }
      System.out.println("Target player chosen is " + lTargetPlayer.getName());

      // TODO AT - lTargetPropertyGroup,
      // Get target property based on first non null property the target player has
      PropertyGroup lTargetPropertyGroup = null;
      for (List<Card> lPropertyCards : lTargetPlayer.getPropertyArea().values()) {
        for (Card lCard : lPropertyCards) {
          if (lCard instanceof PropertyCard) {
            lTargetPropertyGroup = ((PropertyCard) lCard).getPropertyGroupList().get(0);
          }
        }
      }
      System.out.println("Target property group is " + lTargetPropertyGroup);

      // Choose source property group based on first non null in the players area
      // need to based this on the card too
      PropertyGroup lSourcePropertyGroup = null;
      for (List<Card> lPropertyCards : mPropertyArea.values()) {
        for (Card lCard : lPropertyCards) {
          if (lCard instanceof PropertyCard) {
            lSourcePropertyGroup = ((PropertyCard) lCard).getPropertyGroupList().get(0);
          }
        }
      }
      System.out.println("Source property group is " + lSourcePropertyGroup);

      System.out.println(
          "Playing card "
              + lCardToPlay.getName()
              + " with a target player of "
              + lTargetPlayer
              + "; a target property of "
              + lTargetPropertyGroup
              + "; a source property of "
              + lSourcePropertyGroup);

      boolean lPlayedCardSuccessfully =
          pMatch.playCard(
              lCardToPlay, this, lTargetPlayer, lSourcePropertyGroup, lTargetPropertyGroup);
      if (!lPlayedCardSuccessfully) {
        System.out.println("Failed to play card " + lCardToPlay.getName());
      }
      // TODO AT - what to do here? how to pick another card / what if that fails? overall for loop
      mCardsInHand.remove(0);
    }
  }