package com.code44.finance.data.model;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Parcel;
import android.os.Parcelable;
import com.code44.finance.common.model.DecimalSeparator;
import com.code44.finance.common.model.GroupSeparator;
import com.code44.finance.common.model.SymbolPosition;
import com.code44.finance.common.utils.Preconditions;
import com.code44.finance.data.Query;
import com.code44.finance.data.db.Column;
import com.code44.finance.data.db.Tables;
import com.code44.finance.utils.IOUtils;
public class Currency extends Model {
public static final Parcelable.Creator<Currency> CREATOR = new Parcelable.Creator<Currency>() {
public Currency createFromParcel(Parcel in) {
return new Currency(in);
}
public Currency[] newArray(int size) {
return new Currency[size];
}
};
private String code;
private String symbol;
private SymbolPosition symbolPosition;
private DecimalSeparator decimalSeparator;
private GroupSeparator groupSeparator;
private int decimalCount;
private boolean isDefault;
private double exchangeRate;
public Currency() {
super();
setCode(null);
setSymbol(null);
setSymbolPosition(SymbolPosition.FarRight);
setDecimalSeparator(DecimalSeparator.Dot);
setGroupSeparator(GroupSeparator.Comma);
setDecimalCount(2);
setDefault(false);
setExchangeRate(1.0);
}
private Currency(Parcel parcel) {
super(parcel);
setCode(parcel.readString());
setSymbol(parcel.readString());
setSymbolPosition(SymbolPosition.fromInt(parcel.readInt()));
setDecimalSeparator(DecimalSeparator.fromSymbol(parcel.readString()));
setGroupSeparator(GroupSeparator.fromSymbol(parcel.readString()));
setDecimalCount(parcel.readInt());
setDefault(parcel.readInt() != 0);
setExchangeRate(parcel.readDouble());
}
public static void updateDefaultCurrency(SQLiteDatabase database, Currency defaultCurrency) {
final Cursor cursor = Query.create()
.projectionLocalId(Tables.Currencies.LOCAL_ID)
.projection(Tables.Currencies.PROJECTION)
.selection(Tables.Currencies.IS_DEFAULT + "=?", "1")
.from(database, Tables.Currencies.TABLE_NAME)
.execute();
defaultCurrency.updateFrom(cursor, null);
IOUtils.closeQuietly(cursor);
}
public static Currency from(Cursor cursor) {
final Currency currency = new Currency();
if (cursor.getCount() > 0) {
currency.updateFrom(cursor, null);
}
return currency;
}
public static Currency fromCurrencyFrom(Cursor cursor) {
final Currency currency = new Currency();
if (cursor.getCount() > 0) {
currency.updateFrom(cursor, Tables.Currencies.TEMP_TABLE_NAME_FROM_CURRENCY);
}
return currency;
}
public static Currency fromCurrencyTo(Cursor cursor) {
final Currency currency = new Currency();
if (cursor.getCount() > 0) {
currency.updateFrom(cursor, Tables.Currencies.TEMP_TABLE_NAME_TO_CURRENCY);
}
return currency;
}
@Override protected Column getLocalIdColumn() {
return Tables.Currencies.LOCAL_ID;
}
@Override protected Column getIdColumn() {
return Tables.Currencies.ID;
}
@Override protected Column getModelStateColumn() {
return Tables.Currencies.MODEL_STATE;
}
@Override protected Column getSyncStateColumn() {
return Tables.Currencies.SYNC_STATE;
}
@Override public void writeToParcel(Parcel parcel, int flags) {
super.writeToParcel(parcel, flags);
parcel.writeString(code);
parcel.writeString(symbol);
parcel.writeInt(symbolPosition.asInt());
parcel.writeString(decimalSeparator.symbol());
parcel.writeString(groupSeparator.symbol());
parcel.writeInt(decimalCount);
parcel.writeInt(isDefault ? 1 : 0);
parcel.writeDouble(exchangeRate);
}
@Override public void updateFrom(Cursor cursor, String columnPrefixTable) {
super.updateFrom(cursor, columnPrefixTable);
int index;
// Code
index = cursor.getColumnIndex(Tables.Currencies.CODE.getName(columnPrefixTable));
if (index >= 0) {
setCode(cursor.getString(index));
}
// Symbol
index = cursor.getColumnIndex(Tables.Currencies.SYMBOL.getName(columnPrefixTable));
if (index >= 0) {
setSymbol(cursor.getString(index));
}
// Symbol position
index = cursor.getColumnIndex(Tables.Currencies.SYMBOL_POSITION.getName(columnPrefixTable));
if (index >= 0) {
setSymbolPosition(SymbolPosition.fromInt(cursor.getInt(index)));
}
// Decimal separator
index = cursor.getColumnIndex(Tables.Currencies.DECIMAL_SEPARATOR.getName(columnPrefixTable));
if (index >= 0) {
setDecimalSeparator(DecimalSeparator.fromSymbol(cursor.getString(index)));
}
// Group separator
index = cursor.getColumnIndex(Tables.Currencies.GROUP_SEPARATOR.getName(columnPrefixTable));
if (index >= 0) {
setGroupSeparator(GroupSeparator.fromSymbol(cursor.getString(index)));
}
// Decimal count
index = cursor.getColumnIndex(Tables.Currencies.DECIMAL_COUNT.getName(columnPrefixTable));
if (index >= 0) {
setDecimalCount(cursor.getInt(index));
}
// Is default
index = cursor.getColumnIndex(Tables.Currencies.IS_DEFAULT.getName(columnPrefixTable));
if (index >= 0) {
setDefault(cursor.getInt(index) != 0);
}
// Exchange rate
index = cursor.getColumnIndex(Tables.Currencies.EXCHANGE_RATE.getName(columnPrefixTable));
if (index >= 0) {
setExchangeRate(cursor.getDouble(index));
}
}
@Override public void prepareForDb() {
super.prepareForDb();
if (symbolPosition == null) {
symbolPosition = SymbolPosition.FarRight;
}
if (decimalSeparator == null) {
decimalSeparator = DecimalSeparator.Dot;
}
if (groupSeparator == null) {
groupSeparator = GroupSeparator.Comma;
}
if (decimalCount > 2) {
decimalCount = 2;
}
if (decimalCount < 0) {
decimalCount = 0;
}
if (Double.compare(exchangeRate, 0.0) < 0) {
exchangeRate = 1.0;
}
}
@Override public void validate() {
super.validate();
Preconditions.notEmpty(code, "Code cannot be empty.");
Preconditions.lengthEquals(code, 3, "Code length must be 3.");
Preconditions.notNull(symbolPosition, "SymbolPosition cannot be null.");
Preconditions.notNull(decimalSeparator, "DecimalSeparator cannot be null.");
Preconditions.notNull(groupSeparator, "GroupSeparator cannot be null.");
Preconditions.between(decimalCount, 0, 2, "Decimal count must be [0, 2]");
Preconditions.moreOrEquals(exchangeRate, 0.0, "Exchange rate must be > 0");
}
@Override public ContentValues asValues() {
final ContentValues values = super.asValues();
values.put(Tables.Currencies.CODE.getName(), code);
values.put(Tables.Currencies.SYMBOL.getName(), symbol);
values.put(Tables.Currencies.SYMBOL_POSITION.getName(), symbolPosition.asInt());
values.put(Tables.Currencies.DECIMAL_SEPARATOR.getName(), decimalSeparator.symbol());
values.put(Tables.Currencies.GROUP_SEPARATOR.getName(), groupSeparator.symbol());
values.put(Tables.Currencies.DECIMAL_COUNT.getName(), decimalCount);
values.put(Tables.Currencies.IS_DEFAULT.getName(), isDefault);
values.put(Tables.Currencies.EXCHANGE_RATE.getName(), isDefault ? 1.0f : getExchangeRate());
return values;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public SymbolPosition getSymbolPosition() {
return symbolPosition;
}
public void setSymbolPosition(SymbolPosition symbolPosition) {
this.symbolPosition = symbolPosition;
}
public DecimalSeparator getDecimalSeparator() {
return decimalSeparator;
}
public void setDecimalSeparator(DecimalSeparator decimalSeparator) {
this.decimalSeparator = decimalSeparator;
}
public GroupSeparator getGroupSeparator() {
return groupSeparator;
}
public void setGroupSeparator(GroupSeparator groupSeparator) {
this.groupSeparator = groupSeparator;
}
public int getDecimalCount() {
return decimalCount;
}
public void setDecimalCount(int decimalCount) {
this.decimalCount = decimalCount;
}
public boolean isDefault() {
return isDefault;
}
public void setDefault(boolean isDefault) {
this.isDefault = isDefault;
}
public double getExchangeRate() {
return exchangeRate;
}
public void setExchangeRate(double exchangeRate) {
this.exchangeRate = exchangeRate;
}
}