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 co.smartreceipts.android.model.Category;
import co.smartreceipts.android.model.factory.CategoryBuilderFactory;
import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata;
import co.smartreceipts.android.persistence.database.operations.OperationFamilyType;
import co.smartreceipts.android.persistence.database.tables.CategoriesTable;
import co.smartreceipts.android.persistence.database.tables.keys.PrimaryKey;
import co.smartreceipts.android.sync.model.SyncState;
/**
* Implements the {@link DatabaseAdapter} contract for the {@link co.smartreceipts.android.persistence.database.tables.CategoriesTable}
*/
public final class CategoryDatabaseAdapter implements DatabaseAdapter<Category, PrimaryKey<Category, String>> {
private final SyncStateAdapter mSyncStateAdapter;
public CategoryDatabaseAdapter() {
this(new SyncStateAdapter());
}
public CategoryDatabaseAdapter(@NonNull SyncStateAdapter syncStateAdapter) {
mSyncStateAdapter = Preconditions.checkNotNull(syncStateAdapter);
}
@Override
@NonNull
public Category read(@NonNull Cursor cursor) {
final int nameIndex = cursor.getColumnIndex(CategoriesTable.COLUMN_NAME);
final int codeIndex = cursor.getColumnIndex(CategoriesTable.COLUMN_CODE);
final String name = cursor.getString(nameIndex);
final String code = cursor.getString(codeIndex);
final SyncState syncState = mSyncStateAdapter.read(cursor);
return new CategoryBuilderFactory().setName(name).setCode(code).setSyncState(syncState).build();
}
@Override
@NonNull
public ContentValues write(@NonNull Category category, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
final ContentValues values = new ContentValues();
values.put(CategoriesTable.COLUMN_NAME, category.getName());
values.put(CategoriesTable.COLUMN_CODE, category.getCode());
if (databaseOperationMetadata.getOperationFamilyType() == OperationFamilyType.Sync) {
values.putAll(mSyncStateAdapter.write(category.getSyncState()));
} else {
values.putAll(mSyncStateAdapter.writeUnsynced(category.getSyncState()));
}
return values;
}
@Override
@NonNull
public Category build(@NonNull Category category, @NonNull PrimaryKey<Category, String> primaryKey, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
return new CategoryBuilderFactory().setName(primaryKey.getPrimaryKeyValue(category)).setCode(category.getCode()).setSyncState(mSyncStateAdapter.get(category.getSyncState(), databaseOperationMetadata)).build();
}
}