package co.smartreceipts.android.model.impl;
import android.os.Parcel;
import android.support.annotation.NonNull;
import java.math.BigDecimal;
import java.math.RoundingMode;
import co.smartreceipts.android.model.Price;
import co.smartreceipts.android.model.PriceCurrency;
import co.smartreceipts.android.model.gson.ExchangeRate;
import co.smartreceipts.android.model.utils.ModelUtils;
/**
* Defines an immutable implementation of the {@link co.smartreceipts.android.model.Price} interface
*/
public final class ImmutablePriceImpl extends AbstractPriceImpl {
private static final int ROUNDING_PRECISION = Price.ROUNDING_PRECISION + 2;
private final BigDecimal price;
private final PriceCurrency currency;
private final ExchangeRate exchangeRate;
private final int decimalPrecision;
public ImmutablePriceImpl(@NonNull BigDecimal price, @NonNull PriceCurrency currency, @NonNull ExchangeRate exchangeRate) {
this(price, currency, exchangeRate, Price.DEFAULT_DECIMAL_PRECISION);
}
public ImmutablePriceImpl(@NonNull BigDecimal price, @NonNull PriceCurrency currency, @NonNull ExchangeRate exchangeRate,
int decimalPrecision) {
this.price = price.setScale(ROUNDING_PRECISION, RoundingMode.HALF_UP);
this.currency = currency;
this.exchangeRate = exchangeRate;
this.decimalPrecision = decimalPrecision;
}
private ImmutablePriceImpl(@NonNull Parcel in) {
this.price = new BigDecimal(in.readFloat());
this.currency = PriceCurrency.getInstance(in.readString());
this.exchangeRate = (ExchangeRate) in.readSerializable();
this.decimalPrecision = in.readInt();
}
@Override
public float getPriceAsFloat() {
return price.floatValue();
}
@Override
@NonNull
public BigDecimal getPrice() {
return price;
}
@Override
@NonNull
public String getDecimalFormattedPrice() {
return ModelUtils.getDecimalFormattedValue(price, decimalPrecision);
}
@Override
@NonNull
public String getCurrencyFormattedPrice() {
return ModelUtils.getCurrencyFormattedValue(price, currency, decimalPrecision);
}
@NonNull
@Override
public String getCurrencyCodeFormattedPrice() {
return ModelUtils.getCurrencyCodeFormattedValue(price, currency, decimalPrecision);
}
@Override
@NonNull
public PriceCurrency getCurrency() {
return currency;
}
@Override
@NonNull
public String getCurrencyCode() {
return currency.getCurrencyCode();
}
@NonNull
@Override
public ExchangeRate getExchangeRate() {
return exchangeRate;
}
@Override
public String toString() {
return getCurrencyFormattedPrice();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeFloat(getPriceAsFloat());
dest.writeString(getCurrencyCode());
dest.writeSerializable(exchangeRate);
dest.writeInt(decimalPrecision);
}
public static final Creator<ImmutablePriceImpl> CREATOR = new Creator<ImmutablePriceImpl>() {
public ImmutablePriceImpl createFromParcel(Parcel source) {
return new ImmutablePriceImpl(source);
}
public ImmutablePriceImpl[] newArray(int size) {
return new ImmutablePriceImpl[size];
}
};
}