/**
   * Add Cash as a separate, automatic asset class that uses all the cash amounts from the
   * investment accounts.
   *
   * @param assetAllocation Main asset allocation object.
   */
  private void addCash(AssetClass assetAllocation) {
    // get all investment accounts, their currencies and cash balances.
    AccountRepository repo = new AccountRepository(getContext());
    AccountService accountService = new AccountService(getContext());
    List<String> investmentAccounts = new ArrayList<>();
    investmentAccounts.add(AccountTypes.INVESTMENT.toString());
    CurrencyService currencyService = new CurrencyService(getContext());
    int destinationCurrency = currencyService.getBaseCurrencyId();
    Money zero = MoneyFactory.fromDouble(0);

    List<Account> accounts = accountService.loadAccounts(false, false, investmentAccounts);

    Money sum = MoneyFactory.fromDouble(0);

    // Get the balances in base currency.
    for (Account account : accounts) {
      int sourceCurrency = account.getCurrencyId();
      Money amountInBase =
          currencyService.doCurrencyExchange(
              destinationCurrency, account.getInitialBalance(), sourceCurrency);
      sum = sum.add(amountInBase);
    }

    // add the cash asset class
    // todo: the allocation needs to be editable!
    AssetClass cash = AssetClass.create(getContext().getString(R.string.cash));
    cash.setType(ItemType.Cash);
    cash.setAllocation(zero);
    cash.setCurrentAllocation(zero);
    cash.setDifference(zero);
    cash.setValue(sum);

    assetAllocation.addChild(cash);
  }
  private void initBaseCurrency(SQLiteDatabase db) {
    Cursor currencyCursor;

    // currencies
    try {
      CurrencyService currencyService = new CurrencyService(getContext());
      Currency systemCurrency = currencyService.getSystemDefaultCurrency();
      if (systemCurrency == null) return;

      InfoService infoService = new InfoService(getContext());

      currencyCursor =
          db.rawQuery(
              "SELECT * FROM "
                  + infoService.repository.getSource()
                  + " WHERE "
                  + Info.INFONAME
                  + "=?",
              new String[] {InfoKeys.BASECURRENCYID});
      if (currencyCursor == null) return;

      boolean recordExists = currencyCursor.moveToFirst();
      int recordId = currencyCursor.getInt(currencyCursor.getColumnIndex(Info.INFOID));
      currencyCursor.close();

      // Use the system default currency.
      int currencyId =
          currencyService.loadCurrencyIdFromSymbolRaw(db, systemCurrency.getCurrencyCode());

      if (!recordExists && (currencyId != Constants.NOT_SET)) {
        long newId = infoService.insertRaw(db, InfoKeys.BASECURRENCYID, currencyId);
        if (newId <= 0) {
          ExceptionHandler handler = new ExceptionHandler(getContext(), this);
          handler.showMessage("error inserting base currency on init");
        }
      } else {
        // Update the (empty) record to the default currency.
        long updatedRecords =
            infoService.updateRaw(db, recordId, InfoKeys.BASECURRENCYID, currencyId);
        if (updatedRecords <= 0) {
          ExceptionHandler handler = new ExceptionHandler(getContext(), this);
          handler.showMessage("error updating base currency on init");
        }
      }

      // Can't use provider here as the database is not ready.
      //            int currencyId =
      // currencyService.loadCurrencyIdFromSymbol(systemCurrency.getCurrencyCode());
      //            String baseCurrencyId = infoService.getInfoValue(InfoService.BASECURRENCYID);
      //            if (!StringUtils.isEmpty(baseCurrencyId)) return;
      //            infoService.setInfoValue(InfoService.BASECURRENCYID,
      // Integer.toString(currencyId));
    } catch (Exception e) {
      ExceptionHandler handler = new ExceptionHandler(getContext(), this);
      handler.handle(e, "init database, currency");
    }
  }
  public void showChart() {
    PayeeReportAdapter adapter = (PayeeReportAdapter) getListAdapter();
    if (adapter == null) return;
    Cursor cursor = adapter.getCursor();
    if (cursor == null) return;
    if (!cursor.moveToFirst()) return;

    ArrayList<ValuePieEntry> arrayList = new ArrayList<ValuePieEntry>();
    while (!cursor.isAfterLast()) {
      ValuePieEntry item = new ValuePieEntry();
      // total
      double total = Math.abs(cursor.getDouble(cursor.getColumnIndex("TOTAL")));
      if (!TextUtils.isEmpty(cursor.getString(cursor.getColumnIndex(ViewMobileData.PAYEE)))) {
        item.setText(cursor.getString(cursor.getColumnIndex(ViewMobileData.PAYEE)));
      } else {
        item.setText(getString(R.string.empty_payee));
      }
      item.setValue(total);
      CurrencyService currencyService = new CurrencyService(getContext());
      item.setValueFormatted(
          currencyService.getBaseCurrencyFormatted(MoneyFactory.fromDouble(total)));
      // add element
      arrayList.add(item);
      // move to next record
      cursor.moveToNext();
    }

    Bundle args = new Bundle();
    args.putSerializable(PieChartFragment.KEY_CATEGORIES_VALUES, arrayList);
    // get fragment manager
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    if (fragmentManager != null) {
      PieChartFragment fragment;
      fragment =
          (PieChartFragment)
              fragmentManager.findFragmentByTag(
                  IncomeVsExpensesChartFragment.class.getSimpleName());
      if (fragment == null) {
        fragment = new PieChartFragment();
      }
      fragment.setChartArguments(args);
      fragment.setDisplayHomeAsUpEnabled(true);

      if (fragment.isVisible()) fragment.onResume();

      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
      if (((PayeesReportActivity) getActivity()).mIsDualPanel) {
        fragmentTransaction.replace(
            R.id.fragmentChart, fragment, PieChartFragment.class.getSimpleName());
      } else {
        fragmentTransaction.replace(
            R.id.fragmentContent, fragment, PieChartFragment.class.getSimpleName());
        fragmentTransaction.addToBackStack(null);
      }
      fragmentTransaction.commit();
    }
  }
  private String getFormattedAccountBalance(Context context, Account account) {
    WhereStatementGenerator where = new WhereStatementGenerator();
    where.addStatement(QueryAccountBills.ACCOUNTID, "=", account.getId());
    String selection = where.getWhere();

    AccountService service = new AccountService(context);
    Money total = service.loadBalance(selection);

    // format the amount
    CurrencyService currencyService = new CurrencyService(context);
    String summary = currencyService.getCurrencyFormatted(account.getCurrencyId(), total);

    return summary;
  }
  private Money sumStockValues(List<Stock> stocks) {
    Money sum = MoneyFactory.fromString("0");
    CurrencyService currencyService = new CurrencyService(getContext());
    AccountRepository repo = new AccountRepository(getContext());
    int baseCurrencyId = currencyService.getBaseCurrencyId();

    for (Stock stock : stocks) {
      // convert the stock value to the base currency.
      int accountId = stock.getHeldAt();
      int currencyId = repo.loadCurrencyIdFor(accountId);
      Money value =
          currencyService.doCurrencyExchange(baseCurrencyId, stock.getValue(), currencyId);

      sum = sum.add(value);
    }
    return sum;
  }
  @Override
  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    super.onLoadFinished(loader, data);
    switch (loader.getId()) {
      case ID_LOADER:
        if (data == null) return;

        // parse cursor for calculate total
        double totalAmount = 0;
        while (data.moveToNext()) {
          totalAmount += data.getDouble(data.getColumnIndex("TOTAL"));
        }

        CurrencyService currencyService = new CurrencyService(getContext());

        TextView txtColumn2 = (TextView) mFooterListView.findViewById(R.id.textViewColumn2);
        txtColumn2.setText(
            currencyService.getBaseCurrencyFormatted(MoneyFactory.fromDouble(totalAmount)));

        // solve bug chart
        if (data.getCount() > 0) {
          getListView().removeFooterView(mFooterListView);
          getListView().addFooterView(mFooterListView);
        }
        // handler to show chart
        if (((PayeesReportActivity) getActivity()).mIsDualPanel) {
          Handler handler = new Handler();
          handler.postDelayed(
              new Runnable() {

                @Override
                public void run() {
                  showChart();
                }
              },
              1 * 1000);
        }
    }
  }
  @Override
  public void bindView(View view, Context context, Cursor cursor) {
    TextView txtColumn1 = (TextView) view.findViewById(R.id.textViewColumn1);
    TextView txtColumn2 = (TextView) view.findViewById(R.id.textViewColumn2);

    Core core = new Core(context);
    double total = cursor.getDouble(cursor.getColumnIndex("TOTAL"));
    String column1;
    String category = cursor.getString(cursor.getColumnIndex(ViewMobileData.Category));
    if (!TextUtils.isEmpty(category)) {
      column1 = "<b>" + category + "</b>";
      String subCategory = cursor.getString(cursor.getColumnIndex(ViewMobileData.Subcategory));
      if (!TextUtils.isEmpty(subCategory)) {
        column1 += " : " + subCategory;
      }
    } else {
      column1 = "<i>" + context.getString(R.string.empty_category);
    }
    txtColumn1.setText(Html.fromHtml(column1));

    CurrencyService currencyService = new CurrencyService(mContext);

    txtColumn2.setText(
        currencyService.getCurrencyFormatted(
            currencyService.getBaseCurrencyId(), MoneyFactory.fromDouble(total)));
    if (total < 0) {
      txtColumn2.setTextColor(
          context.getResources().getColor(core.resolveIdAttribute(R.attr.holo_red_color_theme)));
    } else {
      txtColumn2.setTextColor(
          context.getResources().getColor(core.resolveIdAttribute(R.attr.holo_green_color_theme)));
    }

    // view.setBackgroundColor(core.resolveColorAttribute(cursor.getPosition() % 2 == 1 ?
    // R.attr.row_dark_theme : R.attr.row_light_theme));
  }