package co.smartreceipts.android.persistence.database.tables.adapters;
import android.content.ContentValues;
import android.database.Cursor;
import android.support.annotation.NonNull;
import com.google.common.base.Preconditions;
import java.math.BigDecimal;
import co.smartreceipts.android.model.Distance;
import co.smartreceipts.android.model.Trip;
import co.smartreceipts.android.model.factory.DistanceBuilderFactory;
import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata;
import co.smartreceipts.android.persistence.database.operations.OperationFamilyType;
import co.smartreceipts.android.persistence.database.tables.DistanceTable;
import co.smartreceipts.android.persistence.database.tables.ReceiptsTable;
import co.smartreceipts.android.persistence.database.tables.Table;
import co.smartreceipts.android.persistence.database.tables.keys.PrimaryKey;
import co.smartreceipts.android.sync.model.SyncState;
/**
* Implements the {@link DatabaseAdapter} contract for the {@link DistanceTable}
*/
public final class DistanceDatabaseAdapter implements SelectionBackedDatabaseAdapter<Distance, PrimaryKey<Distance, Integer>, Trip> {
private final Table<Trip, String> mTripsTable;
private final SyncStateAdapter mSyncStateAdapter;
public DistanceDatabaseAdapter(@NonNull Table<Trip, String> tripsTable) {
this(tripsTable, new SyncStateAdapter());
}
public DistanceDatabaseAdapter(@NonNull Table<Trip, String> tripsTable, @NonNull SyncStateAdapter syncStateAdapter) {
mTripsTable = Preconditions.checkNotNull(tripsTable);
mSyncStateAdapter = Preconditions.checkNotNull(syncStateAdapter);
}
@NonNull
@Override
public Distance read(@NonNull Cursor cursor) {
final int parentIndex = cursor.getColumnIndex(ReceiptsTable.COLUMN_PARENT);
final Trip trip = mTripsTable.findByPrimaryKey(cursor.getString(parentIndex)).blockingGet();
return readForSelection(cursor, trip, true);
}
@NonNull
@Override
public Distance readForSelection(@NonNull Cursor cursor, @NonNull Trip trip, boolean isDescending) {
final int idIndex = cursor.getColumnIndex(DistanceTable.COLUMN_ID);
final int locationIndex = cursor.getColumnIndex(DistanceTable.COLUMN_LOCATION);
final int distanceIndex = cursor.getColumnIndex(DistanceTable.COLUMN_DISTANCE);
final int dateIndex = cursor.getColumnIndex(DistanceTable.COLUMN_DATE);
final int timezoneIndex = cursor.getColumnIndex(DistanceTable.COLUMN_TIMEZONE);
final int rateIndex = cursor.getColumnIndex(DistanceTable.COLUMN_RATE);
final int rateCurrencyIndex = cursor.getColumnIndex(DistanceTable.COLUMN_RATE_CURRENCY);
final int commentIndex = cursor.getColumnIndex(DistanceTable.COLUMN_COMMENT);
final int id = cursor.getInt(idIndex);
final String location = cursor.getString(locationIndex);
final BigDecimal distance = BigDecimal.valueOf(cursor.getDouble(distanceIndex));
final long date = cursor.getLong(dateIndex);
final String timezone = cursor.getString(timezoneIndex);
final BigDecimal rate = BigDecimal.valueOf(cursor.getDouble(rateIndex));
final String rateCurrency = cursor.getString(rateCurrencyIndex);
final String comment = cursor.getString(commentIndex);
final SyncState syncState = mSyncStateAdapter.read(cursor);
return new DistanceBuilderFactory(id)
.setTrip(trip)
.setLocation(location)
.setDistance(distance)
.setDate(date)
.setTimezone(timezone)
.setRate(rate)
.setCurrency(rateCurrency)
.setComment(comment)
.setSyncState(syncState)
.build();
}
@NonNull
@Override
public ContentValues write(@NonNull Distance distance, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
final ContentValues values = new ContentValues();
values.put(DistanceTable.COLUMN_PARENT, distance.getTrip().getName());
values.put(DistanceTable.COLUMN_LOCATION, distance.getLocation().trim());
values.put(DistanceTable.COLUMN_DISTANCE, distance.getDistance().doubleValue());
values.put(DistanceTable.COLUMN_TIMEZONE, distance.getTimeZone().getID());
values.put(DistanceTable.COLUMN_DATE, distance.getDate().getTime());
values.put(DistanceTable.COLUMN_RATE, distance.getRate().doubleValue());
values.put(DistanceTable.COLUMN_RATE_CURRENCY, distance.getPrice().getCurrencyCode());
values.put(DistanceTable.COLUMN_COMMENT, distance.getComment().trim());
if (databaseOperationMetadata.getOperationFamilyType() == OperationFamilyType.Sync) {
values.putAll(mSyncStateAdapter.write(distance.getSyncState()));
} else {
values.putAll(mSyncStateAdapter.writeUnsynced(distance.getSyncState()));
}
return values;
}
@NonNull
@Override
public Distance build(@NonNull Distance distance, @NonNull PrimaryKey<Distance, Integer> primaryKey, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
return new DistanceBuilderFactory(primaryKey.getPrimaryKeyValue(distance), distance).setSyncState(mSyncStateAdapter.get(distance.getSyncState(), databaseOperationMetadata)).build();
}
}