package co.smartreceipts.android.model.impl.columns.receipts;
import android.content.Context;
import android.support.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
import co.smartreceipts.android.R;
import co.smartreceipts.android.model.Price;
import co.smartreceipts.android.model.PriceCurrency;
import co.smartreceipts.android.model.Receipt;
import co.smartreceipts.android.model.factory.PriceBuilderFactory;
import co.smartreceipts.android.model.gson.ExchangeRate;
import co.smartreceipts.android.model.impl.ImmutableNetPriceImpl;
import co.smartreceipts.android.model.impl.columns.AbstractColumnImpl;
import co.smartreceipts.android.model.utils.ModelUtils;
import co.smartreceipts.android.sync.model.SyncState;
/**
* Allows us to genericize how different prices are converted to a trip's base currency
*/
public abstract class AbstractExchangedPriceColumn extends AbstractColumnImpl<Receipt> {
private final Context mContext;
public AbstractExchangedPriceColumn(int id, @NonNull String name, @NonNull SyncState syncState, @NonNull Context context) {
super(id, name, syncState);
mContext = context;
}
@Override
public String getValue(@NonNull Receipt receipt) {
final Price price = getPrice(receipt);
final ExchangeRate exchangeRate = price.getExchangeRate();
final PriceCurrency baseCurrency = receipt.getTrip().getTripCurrency();
if (exchangeRate.supportsExchangeRateFor(baseCurrency)) {
return ModelUtils.getDecimalFormattedValue(price.getPrice().multiply(exchangeRate.getExchangeRate(baseCurrency)));
} else {
return mContext.getString(R.string.undefined);
}
}
@Override
@NonNull
public String getFooter(@NonNull List<Receipt> rows) {
if (!rows.isEmpty()) {
final PriceBuilderFactory factory = new PriceBuilderFactory();
final List<Price> prices = new ArrayList<>(rows.size());
for (final Receipt receipt : rows) {
factory.setCurrency(receipt.getTrip().getTripCurrency());
prices.add(getPrice(receipt));
}
factory.setPrices(prices, rows.get(0).getTrip().getTripCurrency());
final Price netPrice = factory.build();
if (netPrice instanceof ImmutableNetPriceImpl) {
// TODO: This should be slightly less hacky
if (((ImmutableNetPriceImpl) netPrice).areAllExchangeRatesValid()) {
return netPrice.getDecimalFormattedPrice();
} else {
return netPrice.getCurrencyCodeFormattedPrice();
}
} else {
return netPrice.getDecimalFormattedPrice();
}
} else {
return "";
}
}
@NonNull
protected abstract Price getPrice(@NonNull Receipt receipt);
}