/**
   * Read in the wishlist from the file, and pack it into an ArrayList of CompressedWishlistInfo for
   * display in the ListView. This data structure stores one copy of the card itself, and a list of
   * set-specific attributes like set name, rarity, and price.
   *
   * @param changedCardName If the wishlist was changed by a dialog, this is the card which we
   *     should look at for changes
   */
  private void readAndCompressWishlist(String changedCardName) {
    /* Read the wishlist */
    ArrayList<MtgCard> wishlist = WishlistHelpers.ReadWishlist(getActivity());
    SQLiteDatabase database = DatabaseManager.getInstance(getActivity(), false).openDatabase(false);
    try {
      /* Translate the set code to tcg name, of course it's not saved */
      for (MtgCard card : wishlist) {
        card.setName = CardDbAdapter.getSetNameFromCode(card.setCode, database);
      }

      /* Clear the wishlist, or just the card that changed */
      if (changedCardName == null) {
        mCompressedWishlist.clear();
      } else {
        for (CompressedWishlistInfo cwi : mCompressedWishlist) {
          if (cwi.mCard.name.equals(changedCardName)) {
            cwi.clearCompressedInfo();
          }
        }
      }

      /* Compress the whole wishlist, or just the card that changed */
      for (MtgCard card : wishlist) {
        if (changedCardName == null || changedCardName.equals(card.name)) {
          /* This works because both MtgCard's and CompressedWishlistInfo's .equals() can compare each
           * other */
          if (!mCompressedWishlist.contains(card)) {
            mCompressedWishlist.add(new CompressedWishlistInfo(card));
          } else {
            mCompressedWishlist.get(mCompressedWishlist.indexOf(card)).add(card);
          }
          /* Look up the new price */
          if (mShowIndividualPrices || mShowTotalWishlistPrice) {
            loadPrice(card.name, card.setCode, card.number);
          }
        }
      }

      /* Check for wholly removed cards if one card was modified */
      if (changedCardName != null) {
        for (int i = 0; i < mCompressedWishlist.size(); i++) {
          if (mCompressedWishlist.get(i).mInfo.size() == 0) {
            mCompressedWishlist.remove(i);
            i--;
          }
        }
      }

      /* Fill extra card data from the database, for displaying full card info */
      CardDbAdapter.fillExtraWishlistData(mCompressedWishlist, database);

    } catch (FamiliarDbException e) {
      handleFamiliarDbException(false);
    }
    DatabaseManager.getInstance(getActivity(), false).closeDatabase(false);
  }
  /**
   * This function takes care of adding a card to the wishlist from this fragment. It makes sure
   * that fields are not null or have bad information.
   */
  private void addCardToWishlist() {
    /* Do not allow empty fields */
    String name = String.valueOf(mNameField.getText());
    String numberOf = (String.valueOf(mNumberField.getText()));
    if (name == null || name.equals("")) {
      return;
    }
    if (numberOf == null || numberOf.equals("")) {
      return;
    }

    SQLiteDatabase database = DatabaseManager.getInstance(getActivity(), false).openDatabase(false);
    try {
      /* Make the new card */
      MtgCard card = new MtgCard();
      card.name = name;
      card.foil = mFoilCheckBox.isChecked();
      card.numberOf = Integer.parseInt(numberOf);
      card.message = getString(R.string.wishlist_loading);

      /* Get some extra information from the database */
      Cursor cardCursor = CardDbAdapter.fetchCardByName(card.name, CardDbAdapter.allData, database);
      if (cardCursor.getCount() == 0) {
        ToastWrapper.makeText(
                WishlistFragment.this.getActivity(),
                getString(R.string.toast_no_card),
                ToastWrapper.LENGTH_LONG)
            .show();
        DatabaseManager.getInstance(getActivity(), false).closeDatabase(false);
        return;
      }
      card.type = cardCursor.getString(cardCursor.getColumnIndex(CardDbAdapter.KEY_TYPE));
      card.rarity = (char) cardCursor.getInt(cardCursor.getColumnIndex(CardDbAdapter.KEY_RARITY));
      card.manaCost = cardCursor.getString(cardCursor.getColumnIndex(CardDbAdapter.KEY_MANACOST));
      card.power = cardCursor.getInt(cardCursor.getColumnIndex(CardDbAdapter.KEY_POWER));
      card.toughness = cardCursor.getInt(cardCursor.getColumnIndex(CardDbAdapter.KEY_TOUGHNESS));
      card.loyalty = cardCursor.getInt(cardCursor.getColumnIndex(CardDbAdapter.KEY_LOYALTY));
      card.ability = cardCursor.getString(cardCursor.getColumnIndex(CardDbAdapter.KEY_ABILITY));
      card.flavor = cardCursor.getString(cardCursor.getColumnIndex(CardDbAdapter.KEY_FLAVOR));
      card.number = cardCursor.getString(cardCursor.getColumnIndex(CardDbAdapter.KEY_NUMBER));
      card.setCode = cardCursor.getString(cardCursor.getColumnIndex(CardDbAdapter.KEY_SET));
      card.setName = CardDbAdapter.getSetNameFromCode(card.setCode, database);
      card.cmc = cardCursor.getInt((cardCursor.getColumnIndex(CardDbAdapter.KEY_CMC)));
      card.color = cardCursor.getString(cardCursor.getColumnIndex(CardDbAdapter.KEY_COLOR));
      /* Override choice if the card can't be foil */
      if (!CardDbAdapter.canBeFoil(card.setCode, database)) {
        card.foil = false;
      }
      /* Clean up */
      cardCursor.close();

      /* Add it to the wishlist, either as a new CompressedWishlistInfo, or to an existing one */
      if (mCompressedWishlist.contains(card)) {
        CompressedWishlistInfo cwi = mCompressedWishlist.get(mCompressedWishlist.indexOf(card));
        boolean added = false;
        for (IndividualSetInfo isi : cwi.mInfo) {
          if (isi.mSetCode.equals(card.setCode) && isi.mIsFoil.equals(card.foil)) {
            added = true;
            isi.mNumberOf++;
          }
        }
        if (!added) {
          cwi.add(card);
        }
      } else {
        mCompressedWishlist.add(new CompressedWishlistInfo(card));
      }

      /* load the price */
      loadPrice(card.name, card.setCode, card.number);

      /* Sort the wishlist */
      sortWishlist();

      /* Save the wishlist */
      WishlistHelpers.WriteCompressedWishlist(getActivity(), mCompressedWishlist);

      /* Clean up for the next add */
      mNumberField.setText("1");
      mNameField.setText("");
      mFoilCheckBox.setChecked(false);

      /* Redraw the new wishlist with the new card */
      mWishlistAdapter.notifyDataSetChanged();

    } catch (FamiliarDbException e) {
      handleFamiliarDbException(false);
    } catch (NumberFormatException e) {
      /* eat it */
    }
    DatabaseManager.getInstance(getActivity(), false).closeDatabase(false);
  }